export type ReportCardKind = "official" | "unofficial" | "composite";

export type ChartKey =
  | "radar_subjects"
  | "bar_subjects"
  | "line_progress"
  | "distribution"
  | "class_avg_compare"
  | "warning_heatmap";

export const CHART_OPTIONS: { key: ChartKey; label: string }[] = [
  { key: "radar_subjects", label: "رادار دروس" },
  { key: "bar_subjects", label: "میله‌ای دروس" },
  { key: "line_progress", label: "روند پیشرفت نوبت‌ها" },
  { key: "distribution", label: "توزیع نمرات" },
  { key: "class_avg_compare", label: "مقایسه میانگین کلاس" },
  { key: "warning_heatmap", label: "وضعیت هشدار دروس" },
];

export const KIND_LABELS: Record<ReportCardKind, string> = {
  official: "رسمی",
  unofficial: "غیررسمی",
  composite: "ترکیبی",
};

export interface ReportCardWarning {
  id?: number;
  label: string;
  min_score: number;
  max_score: number;
  color: string;
  sort_order?: number;
}

export interface ReportCardSubjectRow {
  id?: number;
  grade_level_id: number;
  grade_level?: { id: number; name: string } | null;
  subject_id: number;
  subject?: { id: number; name: string; code?: string | null } | null;
  included: boolean;
  warnings_enabled: boolean;
  warnings: ReportCardWarning[];
}

export interface GradeEntryAccessGrant {
  id: number;
  report_card_period_id: number;
  period_name?: string | null;
  teacher_user_id: number;
  teacher_name?: string | null;
  teacher_national_code?: string | null;
  starts_at?: string | null;
  ends_at: string;
  note?: string | null;
  is_active: boolean;
  created_by_name?: string | null;
  created_at?: string | null;
}

export interface ReportCardPeriodRow {
  id: number;
  name: string;
  type: string;
  stage_key?: string | null;
  sort_order?: number;
  grade_entry_starts_at?: string | null;
  grade_entry_ends_at?: string | null;
  visible_to_students_at?: string | null;
  is_active: boolean;
  grade_activations?: Array<{
    id: number;
    grade_level_id: number;
    is_active: boolean;
    grade_level?: { id: number; name: string };
  }>;
}

export interface ReportCardItem {
  id: number;
  organization_id: number;
  academic_year_id: number;
  kind: ReportCardKind;
  name: string;
  footer_note?: string | null;
  footer_image_path?: string | null;
  header_text?: string | null;
  footer_text?: string | null;
  min_score: number | string;
  max_score: number | string;
  rounding_mode: string;
  is_visible: boolean;
  show_average: boolean;
  show_gpa: boolean;
  show_descriptive: boolean;
  show_discipline: boolean;
  show_discipline_descriptive: boolean;
  enabled_charts: ChartKey[];
  is_active: boolean;
  branches: Array<{ id: number; name: string }>;
  periods: ReportCardPeriodRow[];
  composite_items: Array<{
    id: number;
    source_report_card_id: number;
    sort_order: number;
    source?: { id: number; name: string; kind: string } | null;
  }>;
  subjects?: ReportCardSubjectRow[];
}

export function toLocalInput(iso?: string | null): string {
  if (!iso) return "";
  const d = new Date(iso);
  if (Number.isNaN(d.getTime())) return "";
  const pad = (n: number) => String(n).padStart(2, "0");
  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
}

export function fromLocalInput(value: string): string | null {
  if (!value) return null;
  return new Date(value).toISOString();
}

const REPORT_CARDS_LIST_STORAGE_KEY = "academic.report-cards.list";

export type ReportCardsListFilters = {
  kind?: ReportCardKind | "all";
  academic_year_id?: number | null;
  branch_id?: number | null;
};

export function reportCardsListQuery(filters: ReportCardsListFilters): URLSearchParams {
  const params = new URLSearchParams();
  if (filters.kind && filters.kind !== "all") params.set("kind", filters.kind);
  if (filters.academic_year_id) params.set("academic_year_id", String(filters.academic_year_id));
  if (filters.branch_id) params.set("branch_id", String(filters.branch_id));
  return params;
}

export function parseReportCardsListFilters(params: URLSearchParams): ReportCardsListFilters {
  const kind = params.get("kind");
  return {
    kind: kind === "official" || kind === "unofficial" || kind === "composite" ? kind : "all",
    academic_year_id: Number(params.get("academic_year_id") || "") || null,
    branch_id: Number(params.get("branch_id") || "") || null,
  };
}

export function rememberReportCardsListQuery(params: URLSearchParams): void {
  if (typeof window === "undefined") return;
  const qs = params.toString();
  if (qs) sessionStorage.setItem(REPORT_CARDS_LIST_STORAGE_KEY, qs);
  else sessionStorage.removeItem(REPORT_CARDS_LIST_STORAGE_KEY);
}

export function readReportCardsListQuery(): URLSearchParams | null {
  if (typeof window === "undefined") return null;
  const raw = sessionStorage.getItem(REPORT_CARDS_LIST_STORAGE_KEY);
  return raw ? new URLSearchParams(raw) : null;
}

export function reportCardsListHref(): string {
  const qs = readReportCardsListQuery()?.toString();
  return qs ? `/academic/report-cards?${qs}` : "/academic/report-cards";
}

export type ReportCardWorkspaceTab = "view" | "grades" | "windows" | "oversight" | "settings";

export const WORKSPACE_TAB_LABELS: Record<ReportCardWorkspaceTab, string> = {
  view: "مشاهده و چاپ",
  grades: "ثبت نمره",
  windows: "بازه ثبت",
  oversight: "نظارت",
  settings: "تنظیمات",
};

export type OfficialPrintColumns = {
  t1Continuous: boolean;
  t1Final: boolean;
  t1Total: boolean;
  t2Continuous: boolean;
  t2Final: boolean;
  annual: boolean;
  finalGrade: boolean;
  result: boolean;
  shahrivar: boolean;
};

export function officialPrintColumns(stageKey?: string | null): OfficialPrintColumns {
  switch (stageKey) {
    case "continuous_t1":
      return {
        t1Continuous: true,
        t1Final: false,
        t1Total: false,
        t2Continuous: false,
        t2Final: false,
        annual: false,
        finalGrade: false,
        result: false,
        shahrivar: false,
      };
    case "continuous_final_t1":
      return {
        t1Continuous: true,
        t1Final: true,
        t1Total: true,
        t2Continuous: false,
        t2Final: false,
        annual: false,
        finalGrade: false,
        result: false,
        shahrivar: false,
      };
    case "continuous_t2":
      return {
        t1Continuous: true,
        t1Final: false,
        t1Total: false,
        t2Continuous: true,
        t2Final: false,
        annual: false,
        finalGrade: false,
        result: false,
        shahrivar: false,
      };
    case "comprehensive_shahrivar":
      return {
        t1Continuous: true,
        t1Final: true,
        t1Total: true,
        t2Continuous: true,
        t2Final: true,
        annual: true,
        finalGrade: true,
        result: true,
        shahrivar: true,
      };
    default:
      return {
        t1Continuous: true,
        t1Final: true,
        t1Total: true,
        t2Continuous: true,
        t2Final: true,
        annual: true,
        finalGrade: true,
        result: true,
        shahrivar: false,
      };
  }
}

export function toFaNum(value?: number | string | null, digits = 2): string {
  if (value === null || value === "") return "—";
  const n = Number(value);
  if (!Number.isFinite(n)) return "—";
  return n.toLocaleString("fa-IR", {
    minimumFractionDigits: Number.isInteger(n) ? 0 : digits,
    maximumFractionDigits: digits,
  });
}

export function printFileStem(className?: string | null, periodName?: string | null): string {
  const parts = ["کارنامه", className, periodName].filter(Boolean).map((part) =>
    String(part).replace(/\s+/g, "-"),
  );
  return parts.join("-") || "کارنامه";
}

export function reportCardWorkspaceHref(
  cardId: number,
  tab: ReportCardWorkspaceTab,
  extra?: Record<string, string | number | null | undefined>,
): string {
  const params = new URLSearchParams({ tab });
  if (extra) {
    for (const [key, value] of Object.entries(extra)) {
      if (value != null && value !== "") params.set(key, String(value));
    }
  }
  return `/academic/report-cards/${cardId}?${params.toString()}`;
}
