import React, { useCallback, useContext, useEffect, useState } from 'react'
import { IPartnersInfo } from '../../models/partnersInfo.model'
import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css'
import './partnersInfo.scss'
import { PartnersInfoService } from '../../services/partnersInfo.service'
import { UserContext, UserContextProps } from '../../hooks/userContext'
import Loader from '../Loader/Loader'
import { CheckboxType } from '../../enum/checkboxType.enum'

const PartnersInfo: React.FC = () => {
  const [refreshData, setRefreshData] = useState(false)
  const [isLoading, setIsLoading] = useState<boolean>(false)
  const [partnersInfo, setPartnersInfo] = useState<IPartnersInfo>({
    grdf_failure: false,
    enedis_failure: false,
    egl_failure: false,
    notification_activated: false,
  })
  const { user }: Partial<UserContextProps> = useContext(UserContext)

  const handleCheckboxChange = (value: boolean, type: CheckboxType): void => {
    switch (type) {
      case CheckboxType.GRDF:
        setPartnersInfo((prevPartnersInfo) => ({
          ...prevPartnersInfo,
          grdf_failure: value,
        }))
        break
      case CheckboxType.ENEDIS:
        setPartnersInfo((prevPartnersInfo) => ({
          ...prevPartnersInfo,
          enedis_failure: value,
        }))
        break
      case CheckboxType.EGL:
        setPartnersInfo((prevPartnersInfo) => ({
          ...prevPartnersInfo,
          egl_failure: value,
        }))
        break
      case CheckboxType.NOTIFICATION:
        setPartnersInfo((prevPartnersInfo) => ({
          ...prevPartnersInfo,
          notification_activated: value,
        }))
        break
      default:
        throw new Error('Unknown checkbox type')
    }
  }

  const handleCancel = useCallback(() => {
    setRefreshData(true)
  }, [setRefreshData])

  const resetFields = useCallback(() => {
    setPartnersInfo({
      grdf_failure: false,
      enedis_failure: false,
      egl_failure: false,
      notification_activated: false,
    })
  }, [setPartnersInfo])

  useEffect(() => {
    let subscribed = true
    resetFields()
    setIsLoading(true)

    async function getPartnersInfo() {
      if (user) {
        const partnersInfoService = new PartnersInfoService()
        const partnersInfoResp: IPartnersInfo | null =
          await partnersInfoService.getPartnersInfo()
        if (partnersInfoResp) {
          setPartnersInfo({
            grdf_failure: partnersInfoResp.grdf_failure,
            enedis_failure: partnersInfoResp.enedis_failure,
            egl_failure: partnersInfoResp.egl_failure,
            notification_activated: partnersInfoResp.notification_activated,
          })
        }
      }
      setIsLoading(false)
    }
    if (subscribed) {
      getPartnersInfo()
    }
    return () => {
      subscribed = false
      setRefreshData(false)
    }
  }, [user, refreshData, setPartnersInfo, resetFields])

  const handleSave = async (): Promise<void> => {
    if (user) {
      const partnersInfoService = new PartnersInfoService()
      await partnersInfoService.savePartnersInfo(partnersInfo, user.xsrftoken)
    }
  }

  return (
    <>
      {isLoading ? (
        <Loader />
      ) : (
        <div className="partnersInfo">
          <h2>État des services des partenaires</h2>
          <div>
            <p className="title">Affichage de la pop-up dans Ecolyo</p>
            <div className="switch_div">
              Pop-up active
              <input
                type="checkbox"
                id="switch_notification"
                onChange={(event) => {
                  handleCheckboxChange(
                    event.currentTarget.checked,
                    CheckboxType.NOTIFICATION
                  )
                }}
                checked={partnersInfo.notification_activated}
              />
              <label htmlFor="switch_notification"></label>
            </div>
            <p className="title">Services concernés</p>
            <div className="switch_div">
              Panne Enedis
              <input
                type="checkbox"
                id="switch_enedis"
                onChange={(event) => {
                  handleCheckboxChange(
                    event.currentTarget.checked,
                    CheckboxType.ENEDIS
                  )
                }}
                checked={partnersInfo.enedis_failure}
              />
              <label htmlFor="switch_enedis"></label>
            </div>
            <div className="switch_div">
              Panne EGL
              <input
                type="checkbox"
                id="switch_egl"
                onChange={(event) => {
                  handleCheckboxChange(
                    event.currentTarget.checked,
                    CheckboxType.EGL
                  )
                }}
                checked={partnersInfo.egl_failure}
              />
              <label htmlFor="switch_egl"></label>
            </div>
            <div className="switch_div">
              Panne GRDF
              <input
                type="checkbox"
                id="switch_grdf"
                onChange={(event) => {
                  handleCheckboxChange(
                    event.currentTarget.checked,
                    CheckboxType.GRDF
                  )
                }}
                checked={partnersInfo.grdf_failure}
              />
              <label htmlFor="switch_grdf"></label>
            </div>
            <div className="buttons">
              <button className="btnCancel" onClick={handleCancel}>
                Annuler
              </button>
              <button className="btnValid" onClick={handleSave}>
                Sauvegarder
              </button>
            </div>
          </div>
        </div>
      )}
    </>
  )
}

export default PartnersInfo