import { create } from "zustand";

interface AuthState {
  token: string | null;
  user: { name?: string; username: string; role: string } | null;
  isHydrated: boolean;
  login: (token: string, user: { name?: string; username: string; role: string }) => void;
  logout: () => void;
  hydrate: () => void;
}

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

  hydrate: () => {
    // ✅ Check sessionStorage first, fallback to localStorage
    const storedUser =
      sessionStorage.getItem("user") || localStorage.getItem("user");
    const storedToken =
      sessionStorage.getItem("access_token") || localStorage.getItem("access_token");

    console.log("🔄 Hydrating auth store...");
    console.log("👤 Stored user:", storedUser);
    console.log("🔑 Stored token:", storedToken ? "EXISTS" : "MISSING");
    console.log("🍪 Cookies:", document.cookie);

    const user = storedUser ? JSON.parse(storedUser) : null;

    // ✅ If found in sessionStorage, also save to localStorage for persistence
    if (storedUser) localStorage.setItem("user", storedUser);
    if (storedToken) localStorage.setItem("access_token", storedToken);

    set({
      token: storedToken,
      user,
      isHydrated: true,
    });

    console.log("✅ Hydration complete. User:", user);
  },

  login: (token, user) => {
    console.log("🔐 Login called, saving user:", user);
    sessionStorage.setItem("user", JSON.stringify(user));
    sessionStorage.setItem("access_token", token);
    localStorage.setItem("user", JSON.stringify(user));       // ✅ persist
    localStorage.setItem("access_token", token);              // ✅ persist
    set({ token, user });
  },

  logout: () => {
    console.log("🚪 Logout called");
    sessionStorage.removeItem("user");
    sessionStorage.removeItem("access_token");
    localStorage.removeItem("user");                          // ✅ clear both
    localStorage.removeItem("access_token");
    set({ token: null, user: null });
  },
}));