'use client';

import { getInitDataPopup } from '@/actions/popupSaidaSite';
import { API_URL, TOKEN } from '@/utils/constants/selectConstants';
import { captureUtmParamsInBrowser } from '@/utils/functions/utm';
import { CotacoesPet, initialDataForm, ISitePopUps, QuotationOfSale, IVagasBuscarDadosParaUsoExterno } from '@/utils/Interfaces/apiInterfaces';
import { ICoberturasBuscarCoberturasComPrecoFormatoComparativo } from '@/utils/Interfaces/ICoberturasBuscarCoberturasComPrecoFormatoComparativo';

import { IBannerMainHome, IStates } from '@/utils/Interfaces/interfacesHome';
import { createContext, Dispatch, useCallback, useContext, useEffect, useState } from 'react';
import { usePathname } from 'next/navigation';
import { useSearchParams } from 'next/navigation';

interface IWebContext {
    isMobile: boolean;
    isModalStateOpen: boolean;
    setIsModalStateOpen: Dispatch<boolean>;
    setIsModalStateOpenLPCaixa: Dispatch<boolean>;
    isModalStateOpenLPCaixa: boolean;
    bannerSite: IBannerMainHome[];
    newComparePlans?: ICoberturasBuscarCoberturasComPrecoFormatoComparativo;
    dataStates: IStates[];
    estadosId: string;
    setEstadosId: Dispatch<string>;
    setQuotationPets(pets: CotacoesPet[]): void;
    quotationPets: CotacoesPet[];
    quotationForSale: QuotationOfSale;
    setQuotationForSale(quota: QuotationOfSale): void;
    nomeLeadDesconto: string;
    setNomeLeadDesconto(name: string): void;
    telefoneLeadDesconto: string;
    setTelefoneLeadDesconto(phone: string): void;
    nomePetLeadDesconto: string;
    setNomePetLeadDesconto(namePet: string): void;
    dadosConfiguracoesPopUps?: ISitePopUps[];
    setDataVagas: Dispatch<IVagasBuscarDadosParaUsoExterno[]>;
    dataVagas: IVagasBuscarDadosParaUsoExterno[];
}

const WebContext = createContext<IWebContext>({} as IWebContext);

export default function Providers({ children }: { children: React.ReactNode; }) {
    const pathname = usePathname();
    const searchParams = useSearchParams();
    const [isMobile, setIsMobile] = useState<boolean>(false);
    const [isModalStateOpen, setIsModalStateOpen] = useState<boolean>(false);
    const [isModalStateOpenLPCaixa, setIsModalStateOpenLPCaixa] = useState<boolean>(false);
    const [quotationPets, setQuotationPets] = useState<CotacoesPet[]>([{ Nome: '', DataNascimento: '', CoberturasId: '' },]);
    const [bannerSite, setBannerSite] = useState<IBannerMainHome[]>([]);
    const [dataStates, setDataStates] = useState<IStates[]>([]);
    const [newComparePlans, setNewComparePlans] = useState<ICoberturasBuscarCoberturasComPrecoFormatoComparativo>();
    const [quotationForSale, setQuotationForSale] = useState<QuotationOfSale>({ ...initialDataForm, });
    const [estadosId, setEstadosId] = useState<string>('');
    const [uf, setUf] = useState<string>('');
    const [dataVagas, setDataVagas] = useState<IVagasBuscarDadosParaUsoExterno[]>([]);

    //Campos lead modal origem caixa
    const [nomeLeadDesconto, setNomeLeadDesconto] = useState<string>('');
    const [telefoneLeadDesconto, setTelefoneLeadDesconto] = useState<string>('');
    const [nomePetLeadDesconto, setNomePetLeadDesconto] = useState<string>('');

    //Campos popup saída do site
    const [dadosConfiguracoesPopUps, setDadosConfiguracoesPopUps] = useState<ISitePopUps[]>([]);

    useEffect(() => {
        const rota = pathname === '/' ? 'home' : pathname;
       
        captureUtmParamsInBrowser(searchParams);
  
   
        const fetchData = async () => {
            try {
                const res = await getInitDataPopup(`PopUpsFuncoesSistemasCredenciadosSiteUrl=${rota}`);               
                setDadosConfiguracoesPopUps(res?.erro ? [] : res);
            } catch (error) {
                console.error(error);
            }
        };

        fetchData();
    }, [pathname, searchParams]);


    useEffect(() => {
        if (typeof window !== 'undefined') {
            const handleResize = () => {
                setIsMobile(window.innerWidth <= 1024);
            };
            handleResize();
            window.addEventListener('resize', handleResize);
            return () => window.removeEventListener('resize', handleResize);
        }
    }, []);

    useEffect(() => {
        const fetchStates = async () => {
            try {
                const url = `Estados/consultar/?order=Nome`;
                const response = await fetch(`${API_URL}${url}`, {
                    headers: {
                        Authorization: TOKEN,
                    },
                });
                setDataStates(Object.values(await response.json()));
            } catch (error) {
                console.error('Erro ao consultar Estados:', error);
            }
        };

        fetchStates();
    }, []);

    useEffect(() => {
        const fetchBanners = async () => {
            try {
                let url = `BannersSite/ObterBanners/1`;

                if (uf) {
                    url += `/?UF=${uf}`;
                }

                const response = await fetch(`${API_URL}${url}`, {
                    headers: {
                        Authorization: TOKEN,
                    },
                });

                setBannerSite(await response.json());
            } catch (error) {
                console.error('Ocorreu um erro ao buscar os items BannersSite:', error);
            }
        };

        fetchBanners();
    }, [uf]);

    const fetchPlans = useCallback(async (EstadosIdLocalStorege: string) => {
        try {
            let params = '';

            if (EstadosIdLocalStorege) {
                params = `&EstadosId=${EstadosIdLocalStorege}`;
            }

            const url = `Coberturas/BuscarCoberturasComPreco?Valores=true&order=Ordem${params}&FormatarComparativo=true`;

            const response = await fetch(`${API_URL}${url}`, {
                headers: {
                    Authorization: TOKEN,
                },
            });

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

            const data = await response.json();

            setNewComparePlans(data);
        } catch (error) {
            console.error('Ocorreu um erro ao buscar os itens getPlans:', error);
        }
    }, []);

    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);

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

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

    return (
        <WebContext.Provider
            value={{
                isMobile,
                isModalStateOpen,
                setIsModalStateOpen,
                newComparePlans,
                dataStates,
                bannerSite,
                estadosId,
                setEstadosId,
                quotationPets,
                setQuotationPets,
                quotationForSale,
                setQuotationForSale,
                setIsModalStateOpenLPCaixa,
                isModalStateOpenLPCaixa,
                nomeLeadDesconto,
                setNomeLeadDesconto,
                telefoneLeadDesconto,
                setTelefoneLeadDesconto,
                nomePetLeadDesconto,
                setNomePetLeadDesconto,
                dadosConfiguracoesPopUps,
                setDataVagas,
                dataVagas
            }}
        >
            {children}
        </WebContext.Provider>
    );
}

export function useWebContext(): IWebContext {
    const context = useContext(WebContext);
    if (!context) {
        throw new Error('useWebContext precisa ser utilizado junto ao Providers');
    }
    return context;
}