import { create } from "zustand";
import { devtools, persist } from "zustand/middleware";

interface UserState {
  userId: number | null;
  email: string;
  displayName: string;
  joinedAt: string;
  onboardingDone: boolean;
  role: "admin" | "user" | "";
  approvalStatus: "approved" | "pending" | "denied" | "";

  setUser: (email: string) => void;
  setMe: (data: { email: string; name: string; role: "admin" | "user"; approval_status: "approved" | "pending" | "denied"; userId?: number | null }) => void;
  setDisplayName: (name: string) => void;
  setOnboardingDone: () => void;
  clearUser: () => void;
}

export const useUserStore = create<UserState>()(
  devtools(
    persist(
      (set) => ({
        userId: null,
        email: "",
        displayName: "",
        joinedAt: "",
        onboardingDone: false,
        role: "",
        approvalStatus: "",

        setUser: (email) =>
          set(
            { email, joinedAt: new Date().toISOString() },
            false, "user/setUser"
          ),

        setMe: ({ email, name, role, approval_status, userId }) =>
          set(
            { email, displayName: name, role, approvalStatus: approval_status, userId: userId ?? null },
            false, "user/setMe"
          ),

        setDisplayName: (displayName) =>
          set({ displayName }, false, "user/setDisplayName"),

        setOnboardingDone: () =>
          set({ onboardingDone: true }, false, "user/setOnboardingDone"),

        clearUser: () =>
          set(
            (state) => ({ userId: null, email: "", displayName: "", joinedAt: "", role: "", approvalStatus: "", onboardingDone: state.onboardingDone }),
            false, "user/clearUser"
          ),
      }),
      {
        name: "iih-ai-note-taker-user",
        partialize: (state) => ({
          userId: state.userId,
          email: state.email,
          displayName: state.displayName,
          joinedAt: state.joinedAt,
          onboardingDone: state.onboardingDone,
        }),
      }
    ),
    { name: "UserStore" }
  )
);
