import Link from 'next/link'
import { useContext, useState, useEffect } from 'react'
import { UserContext } from '../../contexts/UserContext'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faPen, faTimes } from '@fortawesome/free-solid-svg-icons'
import date from 'date-and-time'
import HeadTag from '../../components/HeadTag'
import FunctionCard from '../../components/FunctionCard/FunctionCard'
import Modal from '../../components/Modal'
import redirect from '../../utils/redirect'
import htmlParser from 'html-react-parser'
import Loader from '../../components/Loader'
import ReactMarkdown from 'react-markdown'
import CodeBlock from '../../components/CodeBlock'
import api, { API_URL } from '../../utils/api'
import '../../public/css/pages/profile.css'

const Profile = props => {
  const { isAuth, user, logoutUser } = useContext(UserContext)
  const [isOpen, setIsOpen] = useState(false)
  const [inputState, setInputState] = useState({})
  const [message, setMessage] = useState('')
  const [isLoading, setIsLoading] = useState(false)

  useEffect(() => {
    if (isAuth) {
      setInputState({
        name: user.name,
        email: user.email,
        biography: user.biography,
        isPublicEmail: user.isPublicEmail
      })
    }
  }, [isAuth])

  const toggleModal = () => setIsOpen(!isOpen)

  const handleChange = (event, isTypeCheck = false) => {
    const inputStateNew = { ...inputState }
    inputStateNew[event.target.name] =
      event.target.files != null
        ? event.target.files[0]
        : isTypeCheck
          ? event.target.checked
          : event.target.value
    setInputState(inputStateNew)
  }

  const handleSubmit = event => {
    event.preventDefault()
    const token = user.token
    if (isAuth && token != null) {
      setIsLoading(true)
      const formData = new window.FormData()
      formData.append('name', inputState.name)
      formData.append('email', inputState.email)
      formData.append('biography', inputState.biography)
      formData.append('isPublicEmail', inputState.isPublicEmail)
      formData.append('logo', inputState.logo)

      api
        .put('/users/', formData, { headers: { Authorization: token } })
        .then(() => {
          setIsLoading(false)
          logoutUser()
          redirect({}, '/users/login?isSuccessEdit=true')
        })
        .catch(error => {
          setMessage(
            `<p class="form-error"><b>Erreur:</b> ${error.response.data.message}</p>`
          )
          setIsLoading(false)
        })
    }
  }

  return (
    <>
      <HeadTag
        title={`${props.name} - FunctionProject`}
        description={`Profil utilisateur de ${props.name}. ${
          props.biography != null ? props.biography : ''
        }`}
      />

      {/* Édition du profil */}
      {isOpen
        ? (
          <Modal toggleModal={toggleModal}>
            <div className='Profile__container container-fluid'>
              <div className='Profile__row row'>
                <div className='col-24'>
                  <div className='Profile__Modal-top-container row'>
                    <div className='col-24'>
                      <span
                        onClick={toggleModal}
                        style={{
                          cursor: 'pointer',
                          position: 'absolute',
                          left: 0
                        }}
                      >
                        <FontAwesomeIcon
                          icon={faTimes}
                          style={{ width: '1.5rem', color: 'red' }}
                        />
                      </span>
                      <h2 className='text-center'>Éditer le profil</h2>
                      <p className='text-center'>
                        <em>
                          (Vous devrez vous reconnecter après la sauvegarde){' '}
                          <br /> Si vous changez votre adresse email, vous devrez
                          la confirmer comme à l'inscription (vérifier vos
                          emails).
                        </em>
                      </p>
                    </div>
                  </div>
                </div>

                <div className='col-24'>
                  <form onSubmit={handleSubmit}>
                    <div className='form-group'>
                      <label className='form-label' htmlFor='name'>
                        Nom :
                      </label>
                      <input
                        value={inputState.name}
                        onChange={handleChange}
                        type='text'
                        name='name'
                        id='name'
                        className='form-control'
                        placeholder='Divlo'
                      />
                    </div>

                    <div className='form-group'>
                      <label className='form-label' htmlFor='email'>
                        Email :
                      </label>
                      <input
                        value={inputState.email}
                        onChange={handleChange}
                        type='email'
                        name='email'
                        id='email'
                        className='form-control'
                        placeholder='email@gmail.com'
                      />
                    </div>

                    <div className='form-group custom-control custom-switch'>
                      <input
                        onChange={event => handleChange(event, true)}
                        type='checkbox'
                        name='isPublicEmail'
                        checked={inputState.isPublicEmail}
                        className='custom-control-input'
                        id='isPublicEmail'
                      />
                      <label
                        className='custom-control-label'
                        htmlFor='isPublicEmail'
                      >
                        Email Public
                      </label>
                    </div>

                    <div className='form-group'>
                      <label className='form-label' htmlFor='biography'>
                        Biographie :
                      </label>
                      <textarea
                        style={{ height: 'auto' }}
                        value={inputState.biography}
                        onChange={handleChange}
                        name='biography'
                        id='biography'
                        className='form-control'
                        rows='5'
                      />
                    </div>

                    <div className='form-group'>
                      <label className='form-label' htmlFor='logo'>
                        Logo <em>(400x400 recommandé)</em> :
                      </label>
                      <p style={{ margin: 0 }}>
                        <em>
                          Si aucun fichier est choisi, le logo ne sera pas
                          modifié.
                        </em>
                      </p>
                      <input
                        onChange={handleChange}
                        accept='image/jpeg,image/jpg,image/png,image/gif'
                        type='file'
                        name='logo'
                        id='logo'
                      />
                    </div>

                    <div className='form-group text-center'>
                      <button type='submit' className='btn btn-dark'>
                        Sauvegarder
                      </button>
                    </div>
                  </form>
                  <div className='form-result text-center'>
                    {isLoading ? <Loader /> : htmlParser(message)}
                  </div>
                </div>
              </div>
            </div>
          </Modal>
          )
        : (
          <div className='container-fluid Profile__container'>
            <div className='row Profile__row'>
              <div className='col-20'>
                <div className='text-center'>
                  <h1>
                    Profil de <span className='important'>{props.name}</span>
                  </h1>
                </div>
                <div className='row justify-content-center'>
                  <div className='col-24 text-center'>
                    <img
                      className='Profile__logo'
                      src={API_URL + props.logo}
                      alt={props.name}
                    />
                  </div>

                  <div className='col-24 text-center'>
                    {props.biography != null && <p>{props.biography}</p>}
                    {props.email != null && (
                      <p>
                        <span className='important'>Email :</span> {props.email}
                      </p>
                    )}
                    <p>
                      <span className='important'>
                        Date de création du compte :
                      </span>{' '}
                      {date.format(
                        new Date(props.createdAt),
                        'DD/MM/YYYY à HH:mm',
                        false
                      )}
                    </p>
                  </div>

                  {isAuth && user.name === props.name && (
                    <button
                      onClick={toggleModal}
                      style={{ marginBottom: '25px' }}
                      className='btn btn-dark'
                    >
                      <FontAwesomeIcon
                        icon={faPen}
                        style={{ cursor: 'pointer', width: '1rem' }}
                      />
                    &nbsp; Éditez le profil
                    </button>
                  )}
                </div>
              </div>
            </div>

            {props.favoritesArray.length > 0 && (
              <div className='row justify-content-center'>
                <div className='col-24 text-center'>
                  <h2>
                    Dernières fonctions ajoutées aux{' '}
                    <span className='important'>favoris</span> :
                  </h2>
                </div>
                <div className='col-24'>
                  <div className='row justify-content-center'>
                    {props.favoritesArray.map(favorite => {
                      return <FunctionCard key={favorite.id} {...favorite} />
                    })}
                  </div>
                </div>
              </div>
            )}

            {props.commentsArray.length > 0 && (
              <div className='row justify-content-center'>
                <div className='col-24 text-center'>
                  <h2>
                    Derniers <span className='important'>commentaires</span> :
                  </h2>
                </div>
                <div className='col-24'>
                  {props.commentsArray.map(comment => (
                    <div
                      key={comment.id}
                      className='row Profile__row Profile__comment'
                    >
                      <div className='col-20'>
                        <p style={{ textAlign: 'center', marginTop: '30px' }}>
                          Posté sur la fonction&nbsp;
                          <Link
                            href={
                            comment.function.type === 'form' ||
                            comment.function.type === 'article'
                              ? '/functions/[slug]'
                              : `/functions/${comment.function.slug}`
                          }
                            as={`/functions/${comment.function.slug}`}
                          >
                            <a>{comment.function.title}</a>
                          </Link>
                        &nbsp;le{' '}
                          {date.format(
                            new Date(comment.createdAt),
                            'DD/MM/YYYY à HH:mm',
                            false
                          )}
                        </p>
                        <ReactMarkdown
                          source={comment.message}
                          renderers={{ code: CodeBlock }}
                        />
                      </div>
                    </div>
                  ))}
                </div>
              </div>
            )}

            {props.quotesArray.length > 0 && (
              <div className='row justify-content-center'>
                <div className='col-24 text-center'>
                  <h2>
                    Dernières <span className='important'>citations</span>{' '}
                    proposées (et validées) :
                  </h2>
                  <p>
                    Citations pour la fonction{' '}
                    <Link href='/functions/randomQuote'>
                      <a>Générateur de citations</a>
                    </Link>
                    .
                  </p>
                </div>
                <div className='col-24 table-column'>
                  <table style={{ marginBottom: '50px' }}>
                    <thead>
                      <tr>
                        <th className='table-row' scope='col'>
                          Citation/Proverbe
                        </th>
                        <th className='table-row' scope='col'>
                          Auteur
                        </th>
                      </tr>
                    </thead>
                    <tbody>
                      {props.quotesArray.map((currentQuote, index) => {
                        return (
                          <tr key={index}>
                            <td className='table-row text-center'>
                              {currentQuote.quote}
                            </td>
                            <td className='table-row text-center'>
                              {currentQuote.author}
                            </td>
                          </tr>
                        )
                      })}
                    </tbody>
                  </table>
                </div>
              </div>
            )}
          </div>
          )}
    </>
  )
}

export async function getServerSideProps (context) {
  const { name } = context.params
  return api
    .get(`/users/${name}`)
    .then(response => ({ props: response.data }))
    .catch(() => redirect(context, '/404'))
}

export default Profile
