"use client";

import { createContext, useContext, useState, useCallback, type ReactNode } from "react";

export type Role =
  | "sales"
  | "operasional"
  | "procurement"
  | "ops_manager"
  | "direktur"
  | "admin"
  | "ga_admin"
  | "ops_admin"
  | "ga_manager"
  | "procurement_manager";

export const ALL_ROLES: Role[] = [
  "sales",
  "operasional",
  "procurement",
  "ops_manager",
  "direktur",
  "admin",
  "ga_admin",
  "ops_admin",
  "ga_manager",
  "procurement_manager",
];

export const ROLE_LABELS: Record<Role, string> = {
  sales: "Sales",
  operasional: "Operasional",
  procurement: "Procurement",
  ops_manager: "OPS Manager",
  direktur: "Direktur",
  admin: "Admin/IT",
  ga_admin: "GA Admin",
  ops_admin: "OPS Admin",
  ga_manager: "GA Manager",
  procurement_manager: "Procurement Manager",
};

type User = {
  id: string;
  name: string;
  email: string;
  role: Role;
  isDemoAccount: boolean;
};

type Session = {
  user: User;
  activeRole: Role;
  availableRoles: Role[];
};

type AuthContextValue = {
  session: Session | null;
  isAuthenticated: boolean;
  activeRole: Role | null;
  hasRole: (...roles: Role[]) => boolean;
  loginDemo: (role: Role) => void;
  switchRole: (role: Role) => void;
  logout: () => void;
};

const DEMO_USER: User = {
  id: "demo-001",
  name: "Demo User",
  email: "demo@spektatech.com",
  role: "admin",
  isDemoAccount: true,
};

const AuthContext = createContext<AuthContextValue | null>(null);

export function AuthProvider({ children }: { children: ReactNode }) {
  const [session, setSession] = useState<Session | null>(null);

  const loginDemo = useCallback((role: Role) => {
    setSession({ user: { ...DEMO_USER, role }, activeRole: role, availableRoles: ALL_ROLES });
  }, []);

  const switchRole = useCallback((role: Role) => {
    setSession((prev) => {
      if (!prev || !prev.user.isDemoAccount) {
        return prev;
      }

      return { ...prev, activeRole: role };
    });
  }, []);

  const logout = useCallback(() => {
    setSession(null);
  }, []);

  const value: AuthContextValue = {
    session,
    isAuthenticated: session !== null,
    activeRole: session?.activeRole ?? null,
    hasRole: (...roles: Role[]) => {
      if (!session) return false;
      return roles.includes(session.activeRole);
    },
    loginDemo,
    switchRole,
    logout,
  };

  return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
}

export function useAuth(): AuthContextValue {
  const ctx = useContext(AuthContext);
  if (!ctx) throw new Error("useAuth must be used within an AuthProvider");
  return ctx;
}
