import { getActivePermissions, getActiveRole } from "./session-context";

export { getActiveRole, getActivePermissions };

export function isDeveloper(role?: string | null): boolean {
  return (role ?? getActiveRole()) === "developer";
}

export function isHoldingAdmin(role?: string | null): boolean {
  const r = role ?? getActiveRole();
  return r === "developer" || r === "super_admin";
}

export function userHasHoldingAdminRole(user?: { roles?: string[] } | null): boolean {
  return Boolean(user?.roles?.some((role) => role === "developer" || role === "super_admin"));
}

export function hasPermission(permission: string): boolean {
  if (isHoldingAdmin()) return true;
  return getActivePermissions().includes(permission);
}

export function hasAnyPermission(...permissions: string[]): boolean {
  return permissions.some((p) => hasPermission(p));
}

const STUDENT_MANAGER_ROLES = [
  "developer",
  "super_admin",
  "branch_manager",
  "grade_coordinator",
  "deputy_education",
  "deputy_discipline",
  "deputy_executive",
];

/** Student create/edit/delete/reset/release — matches API `sis.enrollment.create`. */
export function canManageStudents(): boolean {
  if (isTeacherRole()) return false;
  if (hasPermission("sis.enrollment.create")) return true;
  const role = getActiveRole();
  // Fallback when permissions array was not hydrated in session.
  return !!role && STUDENT_MANAGER_ROLES.includes(role);
}

/** Manager-level grade grid / report-card admin surfaces. */
export function canManageGradesAdmin(): boolean {
  const role = getActiveRole();
  if (!role) return false;
  if (role === "teacher" || role === "guest_teacher") return false;
  return (
    hasPermission("academic.grade_entry.manage") ||
    ["developer", "super_admin", "branch_manager", "grade_coordinator", "deputy_education"].includes(role)
  );
}

export function isTeacherRole(role?: string | null): boolean {
  const r = role ?? getActiveRole();
  return r === "teacher" || r === "guest_teacher";
}

export function canAccessAcademicAdmin(): boolean {
  return !isTeacherRole();
}

/** School setup: classes, periods, subjects, books, weekly schedule, class teachers, placement. */
export function canAccessSchoolSetup(): boolean {
  return !isTeacherRole();
}

/** Holding-wide official report cards may only be created and managed by super admin. */
export function canManageOfficialReportCard(): boolean {
  return isHoldingAdmin();
}

export function canCreateOfficialReportCard(): boolean {
  return canManageOfficialReportCard();
}

export function canManageReportCard(kind?: string | null): boolean {
  if (isTeacherRole()) return false;
  if (kind === "official") return canManageOfficialReportCard();
  return canAccessAcademicAdmin();
}

export function canManageOrgSubjects(): boolean {
  return hasPermission("academic.curriculum.manage");
}

export function canManageBranchSubjects(): boolean {
  if (hasPermission("academic.schedule.manage")) return true;
  const role = getActiveRole();
  return role === "branch_manager" || isHoldingAdmin(role);
}
