import { createContext, useContext, useState, ReactNode } from 'react';

export type AppRole =
  | 'sys_admin'
  | 'sys_manager'
  | 'admin'
  | 'manager'
  | 'company_manager'
  | 'company_trainer'
  | 'delegate';

const SYS_ROLES: AppRole[] = ['sys_admin', 'sys_manager', 'admin', 'manager'];

interface PreviewState {
  active: boolean;
  role: AppRole | null;
  companyId: string | null;
  companyName: string | null;
  previewEmail: string | null;
}

interface RolePreviewContextType {
  preview: PreviewState;
  startPreview: (
    role: AppRole,
    companyId?: string | null,
    companyName?: string | null,
    previewEmail?: string | null,
  ) => void;
  stopPreview: () => void;
  getEffectiveRoles: (realRoles: string[]) => string[];
  getEffectiveHasRole: (realRoles: string[]) => (role: AppRole) => boolean;
  getEffectiveIsSysLevel: (realRoles: string[]) => () => boolean;
  getEffectiveCompanyId: (realCompanyId: string | null) => string | null;
}

const RolePreviewContext = createContext<RolePreviewContextType>({
  preview: { active: false, role: null, companyId: null, companyName: null, previewEmail: null },
  startPreview: () => {},
  stopPreview: () => {},
  getEffectiveRoles: (r) => r,
  getEffectiveHasRole: (roles) => (role) => roles.includes(role),
  getEffectiveIsSysLevel: () => () => false,
  getEffectiveCompanyId: (id) => id,
});

export const useRolePreview = () => useContext(RolePreviewContext);

export const RolePreviewProvider = ({ children }: { children: ReactNode }) => {
  const [preview, setPreview] = useState<PreviewState>({
    active: false,
    role: null,
    companyId: null,
    companyName: null,
    previewEmail: null,
  });

  const startPreview = (
    role: AppRole,
    companyId?: string | null,
    companyName?: string | null,
    previewEmail?: string | null,
  ) => {
    setPreview({
      active: true,
      role,
      companyId: companyId || null,
      companyName: companyName || null,
      previewEmail: previewEmail || null,
    });
  };

  const stopPreview = () => {
    setPreview({
      active: false,
      role: null,
      companyId: null,
      companyName: null,
      previewEmail: null,
    });
  };

  const getEffectiveRoles = (realRoles: string[]): string[] => {
    if (!preview.active || !preview.role) return realRoles;
    return [preview.role];
  };

  const getEffectiveHasRole = (realRoles: string[]) => (role: AppRole): boolean => {
    if (!preview.active || !preview.role) return realRoles.includes(role);
    return preview.role === role;
  };

  const getEffectiveIsSysLevel = (realRoles: string[]) => (): boolean => {
    if (!preview.active || !preview.role) {
      return realRoles.some((r) => SYS_ROLES.includes(r as AppRole));
    }
    return SYS_ROLES.includes(preview.role);
  };

  const getEffectiveCompanyId = (realCompanyId: string | null): string | null => {
    if (!preview.active) return realCompanyId;
    return preview.companyId;
  };

  return (
    <RolePreviewContext.Provider
      value={{
        preview,
        startPreview,
        stopPreview,
        getEffectiveRoles,
        getEffectiveHasRole,
        getEffectiveIsSysLevel,
        getEffectiveCompanyId,
      }}
    >
      {children}
    </RolePreviewContext.Provider>
  );
};
