"use client";

import { OfficialPrintColumns, toFaNum } from "@/lib/report-cards";

export interface PrintStudent {
  enrollment_id: number;
  student: {
    first_name?: string | null;
    last_name?: string | null;
    father_name?: string | null;
    national_code?: string | null;
    student_code?: string | null;
    birth_date?: string | null;
    photo_url?: string | null;
  };
  class_room: {
    name?: string | null;
    grade_level_name?: string | null;
    study_field_name?: string | null;
  };
  subjects: Array<{
    subject_id: number;
    code?: string | null;
    name: string;
    units?: number | null;
    comment?: string | null;
    t1_continuous?: number | null;
    t1_final?: number | null;
    t1_total?: number | null;
    t2_continuous?: number | null;
    t2_final?: number | null;
    annual?: number | null;
    final_grade?: number | null;
    shahrivar?: number | null;
    result?: string | null;
    score?: number | null;
    descriptive_grade?: string | null;
  }>;
  discipline?: { score?: number | null } | null;
  summary: {
    total_units?: number | null;
    average?: number | null;
    gpa?: number | null;
    discipline_score?: number | null;
  };
}

export interface PrintPayload {
  title: string;
  report_card: {
    kind: string;
    header_text?: string | null;
    footer_text?: string | null;
    footer_note?: string | null;
    show_average?: boolean;
    show_gpa?: boolean;
    show_discipline?: boolean;
  };
  period: { id: number; name: string; stage_key?: string | null };
  columns?: {
    t1_continuous: boolean;
    t1_final: boolean;
    t1_total: boolean;
    t2_continuous: boolean;
    t2_final: boolean;
    annual: boolean;
    final_grade: boolean;
    result: boolean;
    shahrivar: boolean;
  } | null;
  school: {
    organization_name?: string | null;
    branch_name?: string | null;
    branch_code?: string | null;
    academic_year?: string | null;
    grade_level_name?: string | null;
    study_field_name?: string | null;
    class_name?: string | null;
    class_code?: string | null;
  };
  students: PrintStudent[];
}

function columnsFromApi(raw: PrintPayload["columns"]): OfficialPrintColumns {
  if (!raw) {
    return {
      t1Continuous: true,
      t1Final: true,
      t1Total: true,
      t2Continuous: true,
      t2Final: true,
      annual: true,
      finalGrade: true,
      result: true,
      shahrivar: false,
    };
  }
  return {
    t1Continuous: raw.t1_continuous,
    t1Final: raw.t1_final,
    t1Total: raw.t1_total,
    t2Continuous: raw.t2_continuous,
    t2Final: raw.t2_final,
    annual: raw.annual,
    finalGrade: raw.final_grade,
    result: raw.result,
    shahrivar: raw.shahrivar,
  };
}

function faDate(iso?: string | null): string {
  if (!iso) return "—";
  const date = new Date(iso);
  if (Number.isNaN(date.getTime())) return "—";
  return date.toLocaleDateString("fa-IR");
}

export function OfficialReportCardSheet({
  payload,
  student,
  pageBreak,
}: {
  payload: PrintPayload;
  student: PrintStudent;
  pageBreak?: boolean;
}) {
  const cols = columnsFromApi(payload.columns);
  const school = payload.school;
  const s = student.student;
  const rows = [...student.subjects];
  if (payload.report_card.show_discipline) {
    rows.push({
      subject_id: -1,
      code: "—",
      name: "انضباط",
      units: 1,
      t1_continuous: student.discipline?.score ?? student.summary.discipline_score ?? null,
      t1_final: null,
      t1_total: student.discipline?.score ?? null,
      t2_continuous: null,
      t2_final: null,
      annual: student.discipline?.score ?? null,
      final_grade: student.discipline?.score ?? null,
      shahrivar: null,
      result: null,
    });
  }

  return (
    <section
      className="report-card-sheet"
      style={{ pageBreakAfter: pageBreak ? "always" : "auto" }}
    >
      <header className="sheet-header">
        <div className="header-side">
          <div className="emblem-box">ج.ا.ا</div>
          <p>جمهوری اسلامی ایران</p>
          <p>وزارت آموزش و پرورش</p>
        </div>
        <div className="header-center">
          <h1>{payload.title}</h1>
          <p>{school.organization_name}</p>
        </div>
        <div className="header-side left">
          <div className="photo-box">
            {s.photo_url ? (
              // eslint-disable-next-line @next/next/no-img-element
              <img src={s.photo_url} alt="" />
            ) : (
              <span>عکس</span>
            )}
          </div>
        </div>
      </header>

      <div className="meta-grid">
        <div>
          <strong>آموزشگاه:</strong> {school.branch_name || "—"}
        </div>
        <div>
          <strong>کد آموزشگاه:</strong> {school.branch_code || "—"}
        </div>
        <div>
          <strong>سال تحصیلی:</strong> {school.academic_year || "—"}
        </div>
        <div>
          <strong>پایه / رشته:</strong>{" "}
          {[student.class_room.grade_level_name || school.grade_level_name, student.class_room.study_field_name || school.study_field_name]
            .filter(Boolean)
            .join(" / ") || "—"}
        </div>
        <div>
          <strong>کلاس:</strong> {student.class_room.name || school.class_name || "—"}
        </div>
        <div>
          <strong>نام خانوادگی:</strong> {s.last_name || "—"}
        </div>
        <div>
          <strong>نام:</strong> {s.first_name || "—"}
        </div>
        <div>
          <strong>نام پدر:</strong> {s.father_name || "—"}
        </div>
        <div>
          <strong>کد ملی:</strong> {s.national_code || "—"}
        </div>
        <div>
          <strong>شماره دانش‌آموزی:</strong> {s.student_code || "—"}
        </div>
        <div>
          <strong>تاریخ تولد:</strong> {faDate(s.birth_date)}
        </div>
      </div>

      {payload.report_card.header_text ? (
        <p className="note">{payload.report_card.header_text}</p>
      ) : null}

      <table className="grades">
        <thead>
          <tr>
            <th rowSpan={2}>ردیف</th>
            <th rowSpan={2}>کد درس</th>
            <th rowSpan={2}>نام درس</th>
            <th rowSpan={2}>واحد</th>
            {cols.t1Continuous || cols.t1Final || cols.t1Total ? (
              <th colSpan={[cols.t1Continuous, cols.t1Final, cols.t1Total].filter(Boolean).length}>
                نوبت اول
              </th>
            ) : null}
            {cols.t2Continuous || cols.t2Final ? (
              <th colSpan={[cols.t2Continuous, cols.t2Final].filter(Boolean).length}>نوبت دوم</th>
            ) : null}
            {cols.annual ? <th rowSpan={2}>نمره سالانه</th> : null}
            {cols.shahrivar ? <th rowSpan={2}>شهریور</th> : null}
            {cols.finalGrade ? <th rowSpan={2}>نمره نهایی</th> : null}
            {cols.result ? <th rowSpan={2}>نتیجه</th> : null}
            <th rowSpan={2}>ملاحظات</th>
          </tr>
          <tr>
            {cols.t1Continuous ? <th>مستمر</th> : null}
            {cols.t1Final ? <th>پایانی</th> : null}
            {cols.t1Total ? <th>کل</th> : null}
            {cols.t2Continuous ? <th>مستمر</th> : null}
            {cols.t2Final ? <th>پایانی</th> : null}
          </tr>
        </thead>
        <tbody>
          {rows.map((row, index) => (
            <tr key={row.subject_id}>
              <td>{toFaNum(index + 1, 0)}</td>
              <td>{row.code || "—"}</td>
              <td className="name">{row.name}</td>
              <td>{toFaNum(row.units)}</td>
              {cols.t1Continuous ? <td>{toFaNum(row.t1_continuous)}</td> : null}
              {cols.t1Final ? <td>{toFaNum(row.t1_final)}</td> : null}
              {cols.t1Total ? <td>{toFaNum(row.t1_total)}</td> : null}
              {cols.t2Continuous ? <td>{toFaNum(row.t2_continuous)}</td> : null}
              {cols.t2Final ? <td>{toFaNum(row.t2_final)}</td> : null}
              {cols.annual ? <td>{toFaNum(row.annual)}</td> : null}
              {cols.shahrivar ? <td>{toFaNum(row.shahrivar)}</td> : null}
              {cols.finalGrade ? <td>{toFaNum(row.final_grade)}</td> : null}
              {cols.result ? <td>{row.result || "—"}</td> : null}
              <td>{row.comment || ""}</td>
            </tr>
          ))}
        </tbody>
      </table>

      <div className="summary">
        <div>
          <strong>جمع واحد:</strong> {toFaNum(student.summary.total_units)}
        </div>
        {payload.report_card.show_average ? (
          <div>
            <strong>میانگین:</strong> {toFaNum(student.summary.average)}
          </div>
        ) : null}
        {payload.report_card.show_gpa ? (
          <div>
            <strong>معدل:</strong> {toFaNum(student.summary.gpa)}
          </div>
        ) : null}
      </div>

      {cols.t1Total ? (
        <p className="formula">فرمول کل نوبت اول: کل = (مستمر + ۲ × پایانی) ÷ ۳</p>
      ) : null}

      {payload.report_card.footer_text || payload.report_card.footer_note ? (
        <p className="note">{payload.report_card.footer_text || payload.report_card.footer_note}</p>
      ) : null}

      <footer className="signs">
        <div>
          <p>مسئول ثبت نمرات</p>
          <span>امضا</span>
        </div>
        <div>
          <p>مدیر آموزشگاه</p>
          <span>امضا</span>
        </div>
      </footer>
    </section>
  );
}

export function UnofficialReportCardSheet({
  payload,
  student,
  pageBreak,
}: {
  payload: PrintPayload;
  student: PrintStudent;
  pageBreak?: boolean;
}) {
  const s = student.student;
  return (
    <section
      className="report-card-sheet unofficial"
      style={{ pageBreakAfter: pageBreak ? "always" : "auto" }}
    >
      <header className="sheet-header simple">
        <h1>{payload.title}</h1>
        <p>
          {payload.school.branch_name} · {payload.school.class_name} · {payload.period.name}
        </p>
      </header>
      <p>
        {[s.last_name, s.first_name].filter(Boolean).join(" ")}
        {s.father_name ? ` · فرزند ${s.father_name}` : ""}
        {s.student_code ? ` · ${s.student_code}` : ""}
      </p>
      <table className="grades">
        <thead>
          <tr>
            <th>ردیف</th>
            <th>کد</th>
            <th>درس</th>
            <th>واحد</th>
            <th>نمره</th>
            <th>ملاحظات</th>
          </tr>
        </thead>
        <tbody>
          {student.subjects.map((row, index) => (
            <tr key={row.subject_id}>
              <td>{toFaNum(index + 1, 0)}</td>
              <td>{row.code || "—"}</td>
              <td className="name">{row.name}</td>
              <td>{toFaNum(row.units)}</td>
              <td>{row.descriptive_grade || toFaNum(row.score)}</td>
              <td>{row.comment || ""}</td>
            </tr>
          ))}
        </tbody>
      </table>
      {payload.report_card.show_average ? (
        <p>میانگین: {toFaNum(student.summary.average)}</p>
      ) : null}
    </section>
  );
}
