import { useState } from 'react'
import redirect from '../../utils/redirect'
import FunctionPage from '../../components/FunctionPage/FunctionPage'
import FunctionTabs from '../../components/FunctionPage/FunctionTabs'
import FunctionArticle from '../../components/FunctionPage/FunctionArticle'
import FunctionComments from '../../components/FunctionPage/FunctionComments/FunctionComments'
import Loader from '../../components/Loader'
import api from '../../utils/api'
import '../../public/css/pages/FunctionComponent.css'
import '../../public/css/pages/functions/rightPrice.css'

const PlayRightPrice = () => {
  const [isPlaying, setIsPlaying] = useState(false)
  const [productToGuess, setProductToGuess] = useState({})
  const [isLoadingProduct, setIsLoadingProduct] = useState(false)
  const [enteredPrice, setEnteredPrice] = useState('')
  const [attemptsArray, setAttemptsArray] = useState([])

  const handlePlaying = () => {
    setIsPlaying(true)
    setAttemptsArray([])
    fetchRandomAmazonProduct()
  }

  const fetchRandomAmazonProduct = async () => {
    setIsLoadingProduct(true)
    const { data } = await api.post('/functions/rightPrice')
    setProductToGuess(data)
    setIsLoadingProduct(false)
  }

  const handleChange = event => {
    setEnteredPrice(event.target.value)
  }

  const handleSubmit = async event => {
    event.preventDefault()
    const objectTry = {}
    const guessedPrice = Number(enteredPrice.replace(',', '.').replace(' ', ''))
    if (!isNaN(guessedPrice)) {
      objectTry.guessedPrice = guessedPrice
      objectTry.numberTry = attemptsArray.length + 1
      if (guessedPrice > productToGuess.price) {
        objectTry.message = "C'est moins !"
      } else if (guessedPrice < productToGuess.price) {
        objectTry.message = "C'est plus !"
      } else {
        objectTry.message = 'Bravo, vous avez trouvé le juste prix !'
      }
      setAttemptsArray([objectTry, ...attemptsArray])
    }
    setEnteredPrice('')
  }

  return (
    <div className='container-fluid'>
      {!isPlaying
        ? (
          <div className='row justify-content-center'>
            <div className='form-group text-center'>
              <button
                onClick={handlePlaying}
                type='submit'
                className='btn btn-dark'
              >
                Jouer
              </button>
            </div>
          </div>
          )
        : isLoadingProduct
          ? (
            <div className='row justify-content-center'>
              <Loader />
            </div>
            )
          : (
            <>
              <div className='row justify-content-center'>
                <div
                  style={{ marginBottom: '20px' }}
                  className='col-24 text-center'
                >
                  <h4>{productToGuess.name}</h4>
                  <img
                    src={productToGuess.image}
                    alt={productToGuess.name}
                    className='Product__image'
                  />
                </div>
              </div>

              <div className='row justify-content-center'>
                <div style={{ marginBottom: '25px' }} className='col-24'>
                  {attemptsArray.length > 0 &&
                attemptsArray[0].message ===
                'Bravo, vous avez trouvé le juste prix !'
                    ? (
                      <div className='form-group text-center'>
                        <button
                          onClick={handlePlaying}
                          type='submit'
                          className='btn btn-dark'
                        >
                          Rejouer ?
                        </button>
                      </div>
                      )
                    : (
                      <form onSubmit={handleSubmit}>
                        <div className='text-center'>
                          <input
                            value={enteredPrice}
                            onChange={handleChange}
                            name='enteredPrice'
                            id='enteredPrice'
                            type='number'
                            step='0.01'
                            className='form-control'
                            autoComplete='off'
                            placeholder='Devinez le prix (prix à virgule possible!)'
                          />
                        </div>

                        <div className='form-group text-center'>
                          <button type='submit' className='btn btn-dark'>
                            Deviner
                          </button>
                        </div>
                      </form>
                      )}
                </div>
              </div>

              <div
                style={{ marginBottom: '30px' }}
                className='row justify-content-center'
              >
                {attemptsArray.map((attempt, index) => {
                  const { message } = attempt
                  let priceResultClass
                  if (message === "C'est moins !") {
                    priceResultClass = 'Price__result-moins'
                  } else if (message === "C'est plus !") {
                    priceResultClass = 'Price__result-plus'
                  } else {
                    priceResultClass = 'Price__result-success'
                  }
                  return (
                    <div
                      key={index}
                      className={`col-24 Price__result ${priceResultClass}`}
                    >
                      # {attempt.numberTry} ({attempt.guessedPrice}) {message}
                    </div>
                  )
                })}
              </div>
            </>
            )}
    </div>
  )
}

const FunctionTabManager = props => {
  return (
    <FunctionTabs
      setSlideIndex={props.setSlideIndex}
      slideIndex={props.slideIndex}
    >
      <div style={{ marginTop: '10px' }}>
        <PlayRightPrice />
      </div>
      <div className='FunctionComponent__slide'>
        <FunctionArticle article={props.article} />
      </div>
      <div className='FunctionComponent__slide'>
        <FunctionComments functionId={props.id} />
      </div>
    </FunctionTabs>
  )
}

const rightPrice = props => (
  <FunctionPage
    FunctionTabManager={FunctionTabManager}
    {...props}
    tabNames={['🕹️ Jouer', '📝 Article', '📬 Commentaires']}
  />
)

export async function getServerSideProps (context) {
  return api
    .get('/functions/rightPrice')
    .then(response => ({ props: response.data }))
    .catch(() => redirect(context, '/404'))
}

export default rightPrice
