import {useState} from 'react';
import formUtils from '../utils';
import {KIC_API_QUERY_KEYS} from '../utils/formConstants';
import kicService from '../utils/kicService';
//import TagManager from 'react-gtm-module';

const referralKeys = [
  'clinicName',
  'dob',
  'firstName',
  'lastName',
  'phone1',
  'providerEmail',
  'providerFirstname',
  'providerLastname',
];

interface IObjectKeys {
  [key: string]: any;
}

interface Record {
  [key: string]: any;
}

/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types */
const useReferralHooks = () => {
  // Initial States
  const [referralUserId, setReferralUserId] = useState('');
  const [firstname, setFirstname] = useState('');
  const [lastname, setLastname] = useState('');
  const [phone, setPhone] = useState('');
  const [dob, setDob] = useState('');
  const [oops, setOops] = useState(false);
  const [gender, setGender] = useState('');
  const [captchaMatch, setCaptchaMatch] = useState('');
  const [language, setLanguage] = useState('');
  const [isConsentChecked, setConsentChecked] = useState(false);
  const [providerEmail, setProviderEmail] = useState('');
  const [providerFirstname, setProviderFirstname] = useState('');
  const [providerLastname, setProviderLastname] = useState('');
  const [clinicName, setClinicName] = useState('');
  const [captcha, setCaptcha] = useState('');
  const [captchaImage, setCaptchaImage] = useState('');
  const [referralError, setReferralError] = useState('');
  const [apiSuccess, setApiSuccess] = useState(false);
  const [referralResults, setReferralResults] = useState<Partial<Record>>({});

  const evalKey = (key: string, event: any) => {
    const dobKey = key === 'dob';
    const phoneKey = key === 'phone1';

    if (dobKey) {
      return formUtils.getFormattedDob(event.target.value);
    } else if (phoneKey) {
      return formUtils.getFormattedPhoneNum(event.target.value);
    } else {
      return key;
    }
  };

  const clearErrors = () => setReferralError('');

  const addReferralData = (event: any, setState: any, key: string) => {
    clearErrors();
    const formattedValue = evalKey(key, event);
    const currentState = formattedValue !== key ? formattedValue : event.target.value;
    setState(currentState);
    setReferralResults((prevState: IObjectKeys) => ({...prevState, [key]: currentState}));
  };

  const addReferralDropdownData = (value: any, setState: any, key: string) => {
    clearErrors();
    setState(value.selectedItem);
    setReferralResults((prevState: IObjectKeys) => ({...prevState, [key]: value.selectedItem}));
  };

  const addGender = (value: any) => {
    addReferralDropdownData(value, setGender, KIC_API_QUERY_KEYS.REFERRAL.REF_GENDER);
  };

  const addLanguage = (value: any) => {
    addReferralDropdownData(value, setLanguage, KIC_API_QUERY_KEYS.REFERRAL.REF_LANGUAGE);
  };

  const addCaptchaInput = (event: any) => {
    clearErrors();
    setCaptchaMatch(event.target.value);
  };

  const toggleConsent = () => {
    clearErrors();
    setConsentChecked(!isConsentChecked);
  };

  const errorReset = () => {
    setOops(false);
  };

  const submitPatientReferral = async (recaptchaRef: any) => {
    try {
      const validEmail = formUtils.validateEmail(referralResults['providerEmail']);
      const allChecksPass =
        Object.keys(referralResults).length === 10 &&
        isConsentChecked &&
        validEmail &&
        recaptchaRef.current.getValue() &&
        referralError === '';

      if (!referralResults || Object.keys(referralResults).length === 0) {
        setReferralError('Please fill out all required fields.');
      } else {
        for (let i = 0; i < referralKeys.length; i++) {
          if (!referralResults[referralKeys[i]] || referralResults[referralKeys[i]] === '') {
            setReferralError('Please fill out all required fields.');
          }
        }
      }

      if (!isConsentChecked) {
        setReferralError('Please confirm patient consent.');
      }

      if (!recaptchaRef.current.getValue()) {
        setReferralError('Please validate before continuing.');
      }

      if (!validEmail) {
        setReferralError('Please enter a valid email');
      }

      if (allChecksPass) {
        /*

        TagManager.dataLayer({
          dataLayer: {
            'event': 'ce_formSubmit',
            'formName': 'Patient Referral Form'
          }
        });
        
        let PIIFields = [
          'First Name',
          'Last Name',
          'Phone',
          'Date of Birth',
          'Gender',
          'Provider Email',
          'Provider First Name',
          'Provider Last Name',
          'Clinic Name'
        ];
        
        PIIFields.forEach((field) => {
          TagManager.dataLayer({
            dataLayer: {
              'event': 'ce_formField',
              'formName': 'Patient Referral Form',
              'fieldName': field,
              'fieldValue': 'PII'
            }
          });
        });
        */

        await kicService.submitPatientReferral(referralResults);
        setApiSuccess(true);
      }
    } catch (err) {
      setOops(true);
      console.log(err);
    }
  };

  return {
    dob,
    oops,
    phone,
    gender,
    lastname,
    captcha,
    captchaImage,
    language,
    firstname,
    captchaMatch,
    clinicName,
    providerEmail,
    isConsentChecked,
    referralError,
    apiSuccess,
    referralUserId,
    referralResults,
    providerLastname,
    providerFirstname,

    // Setters
    setDob,
    setPhone,
    setGender,
    addGender,
    errorReset,
    setCaptcha,
    addLanguage,
    setLastname,
    setLanguage,
    setFirstname,
    setClinicName,
    toggleConsent,
    setCaptchaImage,
    addCaptchaInput,
    addReferralData,
    setProviderEmail,
    setReferralUserId,
    setProviderLastname,
    setProviderFirstname,
    submitPatientReferral,
  };
};

export default useReferralHooks;
