import React, { Component } from "react";

import './App.scss';

const backendUrl = "https://kucinakobackend.ichigo.everydayimshuflin.com";

function makeRequest(queryString, jsonHandler) {
  const effectiveUrl = `${backendUrl}/${queryString}`
  fetch(`${effectiveUrl}`)
    .then((resp) => {
      return resp.json()
    })
    .then((json) => {
      jsonHandler(json);
    });
}

function testHandler(json) {
  console.log("JSON");
  console.log(json);
}

function Entry(props) {
  const entry = props.entry;
  return (
    <div className="searchResult" key={ entry.id }>
      <b>{ entry.sai }</b> - { entry.eng }
      <br />
      <span className="synclass">
        <i>{ entry.syn_category }</i>
        { entry.morph_type ? `\t\t${entry.morph_type}` : null }
      </span>
    </div>
  );
}

class Results extends Component {
  constructor(props) {
    super(props);
    this.content = this.content.bind(this);
  }

  content() {
    const num = this.props.searchResults.length;
    const header = (
      <div className="searchResultHeader">
        Searched for <b>{ this.props.searchTerm }</b> search type: { this.props.searchType }, found { num } result(s)
      </div>);
    const entries = this.props.searchResults.map(
      (entry, idx) => <Entry entry={ entry } key= { entry.id } />
    );
    return [header].concat(entries);
  }

  render() {
    const results = this.props.searchResults;
    return(
      <div className='results'>
        { results ? this.content() : "No search" } 
      </div>
    );
  }
}

class App extends Component {
  constructor(props) {
    super(props);
    this.input = React.createRef();
    this.searchEng = this.searchEng.bind(this);
    this.searchSaimiar = this.searchSaimiar.bind(this);

    this.state = {
      searchResults: null,
      searchType: null,
      searchTerm: null
    };
  }

  searchSaimiar(evt) {
    const searchTerm = this.input.current.value;
    const request = `saimiar?sai=like.*${searchTerm}*`
    if (searchTerm === "") {
      this.setState({ searchResults: null, searchTerm: null, searchType: null });
    } else {
      makeRequest(request, (json) => {
        this.setState({ searchResults: json, searchType: "saimiar", searchTerm });
      });
    }
  }

  searchEng(evt) {
    const searchTerm = this.input.current.value;
    const request = `saimiar?eng=like.*${searchTerm}*`
    if (searchTerm === "") {
      this.setState({ searchResults: null, searchTerm: null, searchType: null });
    } else {
      makeRequest(request, (json) => {
        this.setState({ searchResults: json, searchType: "eng-saimiar", searchTerm });
      });
    }
  }

  render() {
    return(
      <main>
        <div className='container'>
          <div className='search'>
            <h1>Kucinako</h1>
            <div className='textInput'>
                <input className='textInput' type="text" ref={ this.input } />
            </div>
            <br/>
            <button onClick={ this.searchSaimiar } className="searchButton">Saimiar</button>
            <button onClick={ this.searchEng } className="searchButton">English</button>
          </div>
          <Results
            searchResults={ this.state.searchResults }
            searchTerm= { this.state.searchTerm }
            searchType={ this.state.searchType }
          />
        </div>
      </main>
    );
  }
}



export default App;
