import { create } from "zustand";
import { loginApi, logoutApi, registerApi, googleLoginApi, deleteAccountApi } from "../services/authApi";

interface User {
  _id?: string;
  fullname?: string;
  email?: string;
  mobileNo?: string;
  user_type?: number;
}

interface LoginPayload {
  email: string;
  password: string;
}
interface RegisterPayload {
  fullname: string;
  email: string;
  password: string;
  countryCode?: number;
  phone?: string;
}

interface AuthState {
  user: User | null;
  token: string | null;
  loading: boolean;
  error: string | null;

  login: (payload: LoginPayload) => Promise<boolean>;
  register: (payload: RegisterPayload) => Promise<boolean>;
  googleLogin: (access_token: string) => Promise<boolean>;

  logout: () => Promise<void>;
  deleteAccount: () => Promise<boolean>;
  initializeAuth: () => void;
}

function setCookie(name: string, value: string, days = 7) {
  if (typeof document === "undefined") return;
  const expires = new Date(Date.now() + days * 24 * 60 * 60 * 1000).toUTCString();
  document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`;
}

function removeCookie(name: string) {
  if (typeof document === "undefined") return;
  document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
}

export const useAuthStore = create<AuthState>((set) => ({
  user: null,
  token: null,
  loading: false,
  error: null,

  initializeAuth: () => {
    if (typeof window !== "undefined") {
      const token = localStorage.getItem("token");
      const user = localStorage.getItem("user");

      if (token) {
        set({
          token,
          user: user ? JSON.parse(user) : null,
        });
      }
    }
  },

  login: async (payload) => {
    try {
      set({ loading: true, error: null });

      const response = await loginApi(payload);

      if (response?.status === 1 || response?.token) {
        const token = response.token;
        const user = response.data;

        localStorage.setItem("token", token);
        localStorage.setItem("user", JSON.stringify(user));

        // ── Middleware mate cookies ──
        setCookie("token", token);
        setCookie("user_type", String(user?.user_type ?? ""));

        set({
          token,
          user,
          loading: false,
        });

        return true;
      }

      set({
        loading: false,
        error: response?.msg || "Login failed",
      });

      return false;
    } catch (error: any) {
      set({
        loading: false,
        error:
          error?.response?.data?.msg ||
          error?.message ||
          "Something went wrong",
      });

      return false;
    }
  },

  googleLogin: async (access_token) => {
    try {
      set({ loading: true, error: null });

      const response = await googleLoginApi(access_token);

      if (response?.status === 1 || response?.token) {
        const token = response.token;
        const user = response.data;

        localStorage.setItem("token", token);
        localStorage.setItem("user", JSON.stringify(user));

        // ── Middleware mate cookies ──
        setCookie("token", token);
        setCookie("user_type", String(user?.user_type ?? ""));

        set({
          token,
          user,
          loading: false,
        });

        return true;
      }

      set({
        loading: false,
        error: response?.msg || "Google Login failed",
      });

      return false;
    } catch (error: any) {
      set({
        loading: false,
        error:
          error?.response?.data?.msg ||
          error?.message ||
          "Google Login failed",
      });

      return false;
    }
  },

  logout: async () => {
    try {
      await logoutApi();
    } catch (error) {
      console.log(error);
    }

    localStorage.removeItem("token");
    localStorage.removeItem("user");

    // ── Cookies clear ──
    removeCookie("token");
    removeCookie("user_type");

    set({
      user: null,
      token: null,
    });

    window.location.href = "/walkthrough";
  },

  deleteAccount: async () => {
    try {
      await deleteAccountApi();

      localStorage.removeItem("token");
      localStorage.removeItem("user");

      // ── Cookies clear ──
      removeCookie("token");
      removeCookie("user_type");

      set({
        user: null,
        token: null,
      });

      window.location.href = "/login";

      return true;
    } catch (error) {
      console.log(error);
      return false;
    }
  },

  register: async (payload) => {
    try {
      set({ loading: true, error: null });

      const response = await registerApi(payload);

      if (response?.status === 1 || response?.token) {
        const token = response.token;
        const user = response.user;

        if (token) {
          localStorage.setItem("token", token);
          setCookie("token", token);
        }

        if (user) {
          localStorage.setItem("user", JSON.stringify(user));
          setCookie("user_type", String(user?.user_type ?? ""));
        }

        set({
          token: token || null,
          user: user || null,
          loading: false,
        });

        return true;
      }

      set({
        loading: false,
        error: response?.msg || "Registration failed",
      });

      return false;
    } catch (error: any) {
      set({
        loading: false,
        error:
          error?.response?.data?.msg ||
          error?.message ||
          "Something went wrong",
      });

      return false;
    }
  },
}));