'use client'

import { createContext, useContext, useState, useCallback, useEffect } from 'react';
import { ICheckoutContext, ICheckoutPets, Pet } from '@/utils/Interfaces/ICheckoutContext';
import { API_URL, TOKEN } from '@/utils/constants/selectConstants';

const CheckoutContext = createContext<ICheckoutContext>({} as ICheckoutContext);

export default function CheckoutProvider({ children }: { children: React.ReactNode; }) {
    const [step, setStep] = useState<number>(1);

    const [pets, setPets] = useState<ICheckoutPets[]>([]);
    const [petsBudget, setPetsBudget] = useState<Pet[]>([]);

    const [document, setDocument] = useState<string>('');
    const [name, setName] = useState<string>('');
    const [phoneNumber, setPhoneNumber] = useState<string>('');
    const [email, setEmail] = useState<string>('');

    const [planId, setPlanId] = useState<string>('');
    const [planTypeId, setPlanTypeId] = useState<string>('');
    const [planName, setPlanName] = useState<string>('');

    const [zipCode, setZipCode] = useState<string>('');
    const [address, setAddress] = useState<string>('');
    const [number, setNumber] = useState<string>('');
    const [state, setState] = useState<string>('');
    const [stateName, setStateName] = useState<string>('');
    const [city, setCity] = useState<string>('');
    const [complement, setComplement] = useState<string>('');
    const [district, setDistrict] = useState<string>('');

    const [paymentMethod, setPaymentMethod] = useState<string>('');

    const [creditCardNumber, setCreditCardNumber] = useState<string>('');
    const [creditCardName, setCreditCardName] = useState<string>('');
    const [creditCardMonth, setCreditCardMonth] = useState<string>('');
    const [creditCardYear, setCreditCardYear] = useState<string>('');
    const [creditCardCvv, setCreditCardCvv] = useState<string>('');
    const [giftCard, setGiftCardCupom] = useState<boolean>(false);

    const [membershipCard, setMembershipCard] = useState<string>('');

    const [budgetId, setBudgetId] = useState<string>('');

    const [membershipValue, setMembershipValue] = useState<number>(0)
    const [giftCardLoteItemId, setGiftCardLoteItemId] = useState<string>('');

    const [consultantId, setConsultantId] = useState<string>('');
    const [consultantPhone, setConsultantPhone] = useState<string>('');
    const [leadsId, setLeadsId] = useState<string>('');

    const [modalContratoCliente, setModalContratoCliente] = useState<boolean>(false);

    const [contratoCheck, setContratoCheck] = useState<boolean>(false);
    const [isModalStateOpen, setIsModalStateOpen] = useState<boolean>(false);
    const [naoInformaIdadePet, setNaoInformaIdadePet] = useState<boolean>(false);
    const [estadosId, setEstadosId] = useState<string>('');
    const [uf, setUf] = useState<string>('');

    const fetchLocation = useCallback(async () => {
        try {
            const url = `VerificarRegiaoPorIp/ObterCidadeEstado/`;
            const response = await fetch(`${API_URL}${url}`, {
                headers: {
                    Authorization: TOKEN,
                },
            });
            const dados = await response.json();

            if (!response.ok) {
                throw new Error(`Erro na requisição: ${response.statusText}`);
            }

            setEstadosId(dados.EstadosId);
            setUf(dados.EstadosUF);

            localStorage.setItem('Estados', dados.EstadosNome);
            localStorage.setItem('Cidade', dados.CidadesNome);
            localStorage.setItem('EstadosId', dados.EstadosId);
            localStorage.setItem('CidadesId', dados.CidadesId);
            localStorage.setItem('UF', dados.EstadosUF);

        } catch (error) {
            console.error('Erro ao buscar localização:', error);
            setIsModalStateOpen(true);
        }
    }, []);

    useEffect(() => {
        const estadosId = window.localStorage.getItem('EstadosId');
        const estadosName = window.localStorage.getItem('Estados');
        estadosId && estadosName ? setStateName(estadosName ?? '') : setStateName('');
        estadosId ?? fetchLocation();
    }, [fetchLocation]);

    return (
        <CheckoutContext.Provider
            value={{
                step,
                setStep,
                pets,
                setPets,
                name,
                setName,
                phoneNumber,
                setPhoneNumber,
                email,
                setEmail,
                leadsId,
                setLeadsId,
                document,
                setDocument,
                zipCode,
                setZipCode,
                address,
                setAddress,
                number,
                setNumber,
                state,
                setState,
                stateName,
                setStateName,
                city,
                setCity,
                complement,
                setComplement,
                district,
                setDistrict,
                paymentMethod,
                setPaymentMethod,
                creditCardNumber,
                setCreditCardNumber,
                creditCardName,
                setCreditCardName,
                creditCardMonth,
                setCreditCardMonth,
                creditCardYear,
                setCreditCardYear,
                creditCardCvv,
                setCreditCardCvv,
                budgetId,
                setBudgetId,
                membershipValue,
                setMembershipValue,
                consultantId,
                setConsultantId,
                setGiftCardCupom,
                giftCard,
                planId,
                setPlanId,
                planTypeId,
                setPlanTypeId,
                membershipCard,
                setMembershipCard,
                giftCardLoteItemId,
                setGiftCardLoteItemId,
                modalContratoCliente,
                setModalContratoCliente,
                petsBudget,
                setPetsBudget,
                contratoCheck,
                setContratoCheck,
                setIsModalStateOpen,
                isModalStateOpen,
                naoInformaIdadePet,
                setNaoInformaIdadePet,
                planName,
                setPlanName,
                setConsultantPhone,
                consultantPhone
            }}
        >
            {children}
        </CheckoutContext.Provider>
    );
}

export function useCheckoutContext(): ICheckoutContext {
    const context = useContext(CheckoutContext);

    if (!context) {
        throw new Error('useCheckoutContext precisa ser utilizado dentro de Providers');
    }

    return context;
}
