import React, { createContext, useState, useContext, useEffect } from "react";
import Cookies from "js-cookie";
import { useRouter } from "next/router";
import api from "../services/Api";
import { toast } from "sonner";

const AuthContext = createContext<any>({});

export const AuthProvider = ({ children }: { children: React.ReactNode }) => {
  const [user, setUser] = useState<any>(null);
  const [ceremony, setCeremony] = useState<any>(null);
  const [loading, setLoading] = useState<any>(true);
  const [loader, setLoader] = useState(false);
  const [selectedProduct, setSelectedProduct] = useState([]);
  const router = useRouter();
  useEffect(() => {
    async function loadUserFromCookies() {
      const token = Cookies.get("token");
      if (token) {
        console.log("Got a token in the cookies, let's see if it is valid");
        api.defaults.headers.Authorization = `Bearer ${token}`;
        if (token != undefined) {
          setUser(token);
        } else {
          router.push("/login");
        }
      } else {
        router.push("/login");
      }
      setLoading(false);
    }
    loadUserFromCookies();

    return;
  }, []);

  const login = async (email: any, password: any) => {
    setLoader(true);
    api
      .post("login", {
        email: email.toString(),
        password: password.toString(),
      })
      .then((response) => {
        setLoader(false);
        if (response.data.success == true) {
          console.log("ser");
          Cookies.set("token", response.data.data.access_token, {
            expires: 60,
          });
          api.defaults.headers.Authorization = `Bearer ${response.data.data.access_token}`;
          setUser(response.data.data.access_token);
          router.push("/ceremony");
        } else {
          toast.error(response.data.message);
        }
      })
      .catch((e) => {
        toast.error("Error Signing In!");
      });
  };

  const logout = () => {
    Cookies.remove("token");
    Cookies.remove("ceremonyId");
    Cookies.remove("arrival");
    Cookies.remove("isPreOrderEnabled");
    setUser(null);
    delete api.defaults.headers.Authorization;
  };

  return (
    <AuthContext.Provider
      value={{
        user,
        login,
        loading,
        loader,
        setLoader,
        selectedProduct,
        setSelectedProduct,
        logout,
        ceremony,
        setCeremony,
      }}
    >
      {/* <LoadingOverlay
        active={loader}
        spinner
        text=""
        className="w-screen h-screen "
      > */}
      {children}
      {/* </LoadingOverlay> */}
    </AuthContext.Provider>
  );
};

export const useAuth = () => useContext(AuthContext);
