"use client";

import * as React from "react";

import type { CurrentUserPermissions } from "../types";
import {
  canPersistModule,
  canReviewModule,
  canSuggestModule,
  getWorkflowRestrictionLabel,
  isReviewerProfile,
  isSuggesterOnlyProfile,
} from "../lib/permission-capabilities";

type PermissionsContextValue = {
  permissions: string[];
  isSuperAdmin: boolean;
  can: (permission: string) => boolean;
  canAny: (permissions: string[]) => boolean;
  canSave: (module: string) => boolean;
  canSuggest: (module: string) => boolean;
  canReview: (module: string) => boolean;
  isSuggesterOnly: boolean;
  isReviewer: boolean;
  workflowRestrictionLabel: string | null;
  refresh: () => void;
};

const PermissionsContext = React.createContext<PermissionsContextValue | null>(null);
const emptyPermissionsUser: CurrentUserPermissions = {
  id: 0,
  principal: "",
  displayName: "",
  email: "",
  permissions: [],
  isSuperAdmin: false,
};

function buildPermissionHelpers(permissions: string[], isSuperAdmin: boolean) {
  const can = (permission: string) => {
    if (isSuperAdmin) return true;
    return permissions.includes(permission);
  };

  const canAny = (perms: string[]) => {
    if (isSuperAdmin) return true;
    return perms.some((p) => permissions.includes(p));
  };

  return {
    permissions,
    isSuperAdmin,
    can,
    canAny,
    canSave: (module: string) => isSuperAdmin || canPersistModule(permissions, module),
    canSuggest: (module: string) => canSuggestModule(permissions, module),
    canReview: (module: string) => canReviewModule(permissions, module),
    isSuggesterOnly: isSuggesterOnlyProfile(permissions),
    isReviewer: isReviewerProfile(permissions),
    workflowRestrictionLabel: getWorkflowRestrictionLabel(permissions),
  };
}

export function PermissionsProvider({
  children,
  currentUser,
}: {
  children: React.ReactNode;
  currentUser?: CurrentUserPermissions;
}) {
  const [tick, setTick] = React.useState(0);

  const value = React.useMemo(() => {
    void tick;
    const user = currentUser ?? emptyPermissionsUser;
    const helpers = buildPermissionHelpers(
      user.permissions,
      user.isSuperAdmin || user.permissions.includes("system.super_admin"),
    );

    return {
      ...helpers,
      refresh: () => setTick((n) => n + 1),
    };
  }, [currentUser, tick]);

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

export function usePermissions() {
  const ctx = React.useContext(PermissionsContext);
  if (!ctx) {
    const user = emptyPermissionsUser;
    return {
      ...buildPermissionHelpers(
        user.permissions,
        user.isSuperAdmin || user.permissions.includes("system.super_admin"),
      ),
      refresh: () => undefined,
    };
  }
  return ctx;
}
