import Link from "next/link";
import { Badge } from "@/components/ui/badge";
import { buttonVariants } from "@/components/ui/button";
import {
  Card,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from "@/components/ui/card";
import { Separator } from "@/components/ui/separator";
import {
  getTrainingCategoryLabel,
  getTrainingStatusLabel,
  getTrainingTypeLabel,
} from "@/constants/thai-labels";
import { cn } from "@/lib/utils";
import type { ReportsDataset } from "../api/types";
import { ReportTableCard } from "./report-table-card";

type ReportKey =
  | "employeeTranscript"
  | "trainingMatrix"
  | "departmentSummary"
  | "annualTrainingSummary";

function buildExportHref(
  report: ReportKey,
  format: "xlsx" | "pdf",
  filters: ReportsDataset["filters"],
) {
  const searchParams = new URLSearchParams({
    report,
    format,
    year: String(filters.year),
  });

  if (filters.company) {
    searchParams.set("company", filters.company);
  }

  if (filters.departmentId) {
    searchParams.set("departmentId", String(filters.departmentId));
  }

  return `/api/reports/export?${searchParams.toString()}`;
}

function getStatusVariant(
  status: ReportsDataset["employeeTranscript"][number]["status"],
) {
  if (status === "approved") {
    return "default";
  }

  if (status === "rejected") {
    return "destructive";
  }

  return "secondary";
}

function formatHours(value: number | null | undefined) {
  if (value === null || value === undefined) {
    return "-";
  }

  return new Intl.NumberFormat("th-TH", {
    minimumFractionDigits: 0,
    maximumFractionDigits: 2,
  }).format(value);
}

function getTargetSourceLabel(
  source: ReportsDataset["trainingMatrix"][number]["targetSource"],
) {
  if (source === "employee") {
    return "รายบุคคล";
  }

  if (source === "policy") {
    return "Training Policy";
  }

  return "ค่าเริ่มต้น";
}

function formatDate(value: string) {
  return new Date(value).toLocaleDateString("th-TH", {
    year: "numeric",
    month: "short",
    day: "numeric",
  });
}

function SummaryCard({
  label,
  value,
  helper,
}: {
  label: string;
  value: string;
  helper: string;
}) {
  return (
    <Card>
      <CardHeader className="pb-2">
        <CardDescription>{label}</CardDescription>
        <CardTitle className="text-2xl">{value}</CardTitle>
      </CardHeader>
      <CardContent className="text-muted-foreground text-sm">
        {helper}
      </CardContent>
    </Card>
  );
}

export function ReportsPageContent({
  data,
}: {
  data: ReportsDataset & { role?: string };
}) {
  const isAdminView = data.role === "owner" || data.role === "admin";
  const approvedTranscript = data.employeeTranscript.filter(
    (row) => row.status === "approved",
  );
  const approvedHours = approvedTranscript.reduce(
    (total, row) => total + (row.approvedHours ?? row.submittedHours),
    0,
  );
  const pendingCount = data.employeeTranscript.filter(
    (row) => row.status === "pending" || row.status === "needs_revision",
  ).length;
  const averageCompliance =
    data.trainingMatrix.length === 0
      ? 0
      : Math.round(
          data.trainingMatrix.reduce(
            (total, row) => total + row.compliancePercent,
            0,
          ) / data.trainingMatrix.length,
        );
  const passedTargetCount = data.trainingMatrix.filter(
    (row) => row.targetStatus === "passed",
  ).length;

  return (
    <div className="space-y-6">
      <Card>
        <CardHeader>
          <CardTitle>ตัวกรองรายงาน</CardTitle>
          <CardDescription>
            {isAdminView
              ? "ดูรายงานแบบสรุปและรายบุคคลตามปี บริษัท และแผนก พร้อมส่งออก Excel และ PDF"
              : "ดูประวัติการอบรมของตนเองตามปีที่ต้องการ"}
          </CardDescription>
        </CardHeader>
        <CardContent>
          <form
            className="grid gap-4 md:grid-cols-2 xl:grid-cols-4"
            method="GET"
          >
            <label className="flex min-w-0 flex-col gap-2 text-sm">
              <span className="font-medium">ปี</span>
              <select
                name="year"
                defaultValue={String(data.filters.year)}
                className="border-input bg-background h-9 rounded-md border px-3 text-sm shadow-xs"
              >
                {data.options.years.map((option) => (
                  <option key={option.value} value={option.value}>
                    {option.label}
                  </option>
                ))}
              </select>
            </label>

            {isAdminView ? (
              <>
                <label className="flex min-w-0 flex-col gap-2 text-sm">
                  <span className="font-medium">บริษัท</span>
                  <select
                    name="company"
                    defaultValue={data.filters.company ?? ""}
                    className="border-input bg-background h-9 rounded-md border px-3 text-sm shadow-xs"
                  >
                    <option value="">ทุกบริษัท</option>
                    {data.options.companies.map((option) => (
                      <option key={option.value} value={option.value}>
                        {option.label}
                      </option>
                    ))}
                  </select>
                </label>

                <label className="flex min-w-0 flex-col gap-2 text-sm">
                  <span className="font-medium">แผนก</span>
                  <select
                    name="departmentId"
                    defaultValue={
                      data.filters.departmentId
                        ? String(data.filters.departmentId)
                        : ""
                    }
                    className="border-input bg-background h-9 rounded-md border px-3 text-sm shadow-xs"
                  >
                    <option value="">ทุกแผนก</option>
                    {data.options.departments.map((option) => (
                      <option key={option.value} value={option.value}>
                        {option.label}
                      </option>
                    ))}
                  </select>
                </label>
              </>
            ) : null}

            <div className="flex min-w-0 flex-col gap-2 sm:flex-row sm:items-end">
              <button
                type="submit"
                className={cn(buttonVariants(), "w-full sm:w-auto")}
              >
                ใช้งานตัวกรอง
              </button>
              <Link
                href="/dashboard/reports"
                className={cn(
                  buttonVariants({ variant: "outline" }),
                  "w-full sm:w-auto",
                )}
              >
                ล้างค่า
              </Link>
            </div>
          </form>
        </CardContent>
      </Card>

      <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
        <SummaryCard
          label="รายการอบรมทั้งหมด"
          value={String(data.employeeTranscript.length)}
          helper="นับตามตัวกรองที่เลือก"
        />
        <SummaryCard
          label="รายการที่อนุมัติแล้ว"
          value={String(approvedTranscript.length)}
          helper="ใช้เฉพาะรายการ APPROVED"
        />
        <SummaryCard
          label="ชั่วโมงที่อนุมัติ"
          value={formatHours(approvedHours)}
          helper="รวมจาก approvedHours หรือ submittedHours"
        />
        <SummaryCard
          label={
            isAdminView ? "ค่าเฉลี่ยความครบถ้วน Matrix" : "รายการรอตรวจสอบ"
          }
          value={isAdminView ? String(passedTargetCount) : String(pendingCount)}
          helper={
            isAdminView
              ? "เฉลี่ยจากพนักงานในขอบเขตที่เลือก"
              : "รวมสถานะ Pending และ Needs Revision"
          }
        />
      </div>

      <Separator />

      <ReportTableCard
        title="Employee Training Transcript"
        description="ประวัติการอบรมรายบุคคล แสดงผลตามสิทธิ์ของผู้ใช้งาน"
        exportLinks={[
          {
            label: "Excel",
            href: buildExportHref("employeeTranscript", "xlsx", data.filters),
          },
          {
            label: "PDF",
            href: buildExportHref("employeeTranscript", "pdf", data.filters),
          },
        ]}
        emptyMessage="ไม่พบประวัติการอบรมตามตัวกรองที่เลือก"
        rows={data.employeeTranscript}
        columns={[
          {
            key: "employee",
            header: "พนักงาน",
            cell: (row) => row.employeeName,
          },
          {
            key: "code",
            header: "รหัส",
            cell: (row) => row.employeeCode ?? "-",
          },
          {
            key: "company",
            header: "บริษัท",
            cell: (row) => row.companyName ?? "-",
          },
          {
            key: "department",
            header: "แผนก",
            cell: (row) => row.departmentName ?? "-",
          },
          { key: "course", header: "หลักสูตร", cell: (row) => row.courseName },
          {
            key: "trainingType",
            header: "ประเภท",
            cell: (row) => getTrainingTypeLabel(row.trainingType),
          },
          {
            key: "category",
            header: "หมวด",
            cell: (row) =>
              row.category ? getTrainingCategoryLabel(row.category) : "-",
          },
          {
            key: "date",
            header: "วันที่อบรม",
            cell: (row) => formatDate(row.trainingDate),
          },
          {
            key: "submittedHours",
            header: "ชั่วโมงที่ส่ง",
            cell: (row) => formatHours(row.submittedHours),
            className: "text-right",
          },
          {
            key: "approvedHours",
            header: "ชั่วโมงที่อนุมัติ",
            cell: (row) => formatHours(row.approvedHours),
            className: "text-right",
          },
          {
            key: "status",
            header: "สถานะ",
            cell: (row) => (
              <Badge variant={getStatusVariant(row.status)}>
                {getTrainingStatusLabel(row.status)}
              </Badge>
            ),
          },
        ]}
      />

      {isAdminView ? (
        <>
          <ReportTableCard
            title="การอบรมตามตำแหน่ง"
            description="สรุปความครบถ้วนของหลักสูตรบังคับต่อพนักงานแต่ละคน"
            exportLinks={[
              {
                label: "Excel",
                href: buildExportHref("trainingMatrix", "xlsx", data.filters),
              },
              {
                label: "PDF",
                href: buildExportHref("trainingMatrix", "pdf", data.filters),
              },
            ]}
            emptyMessage="ไม่พบข้อมูล การอบรมตามตำแหน่ง ตามตัวกรองที่เลือก"
            rows={data.trainingMatrix}
            columns={[
              {
                key: "employee",
                header: "พนักงาน",
                cell: (row) => row.employeeName,
              },
              {
                key: "code",
                header: "รหัส",
                cell: (row) => row.employeeCode ?? "-",
              },
              {
                key: "company",
                header: "บริษัท",
                cell: (row) => row.companyName ?? "-",
              },
              {
                key: "department",
                header: "แผนก",
                cell: (row) => row.departmentName ?? "-",
              },
              {
                key: "position",
                header: "ตำแหน่ง",
                cell: (row) => row.positionName ?? "-",
              },
              {
                key: "approvedHours",
                header: "อนุมัติ",
                cell: (row) => formatHours(row.approvedHours),
                className: "text-right",
              },
              {
                key: "targetHours",
                header: "เป้าหมาย",
                cell: (row) =>
                  `${formatHours(row.targetHours)} (${getTargetSourceLabel(row.targetSource)})`,
                className: "text-right",
              },
              {
                key: "targetStatus",
                header: "สถานะเป้าหมาย",
                cell: (row) => (
                  <Badge
                    variant={
                      row.targetStatus === "passed" ? "default" : "secondary"
                    }
                  >
                    {row.targetStatus === "passed" ? "ผ่าน" : "ยังไม่ผ่าน"}
                  </Badge>
                ),
              },
              {
                key: "requiredCourses",
                header: "ต้องมี",
                cell: (row) => row.requiredCourses,
                className: "text-right",
              },
              {
                key: "completedCourses",
                header: "ครบแล้ว",
                cell: (row) => row.completedCourses,
                className: "text-right",
              },
              {
                key: "compliance",
                header: "ความครบถ้วน",
                cell: (row) => `${row.compliancePercent}%`,
                className: "text-right",
              },
              {
                key: "missingCourses",
                header: "หลักสูตรที่ยังขาด",
                cell: (row) => row.missingCourses || "-",
              },
            ]}
          />

          <ReportTableCard
            title="Department Summary"
            description="ภาพรวมจำนวนพนักงาน รายการอบรม และชั่วโมงที่อนุมัติ แยกตามแผนก"
            exportLinks={[
              {
                label: "Excel",
                href: buildExportHref(
                  "departmentSummary",
                  "xlsx",
                  data.filters,
                ),
              },
              {
                label: "PDF",
                href: buildExportHref("departmentSummary", "pdf", data.filters),
              },
            ]}
            emptyMessage="ไม่พบข้อมูลสรุปตามแผนกจากตัวกรองที่เลือก"
            rows={data.departmentSummary}
            columns={[
              {
                key: "department",
                header: "แผนก",
                cell: (row) => row.departmentName,
              },
              {
                key: "employeeCount",
                header: "พนักงาน",
                cell: (row) => row.employeeCount,
                className: "text-right",
              },
              {
                key: "trainingRecords",
                header: "รายการอบรม",
                cell: (row) => row.trainingRecords,
                className: "text-right",
              },
              {
                key: "approvedRecords",
                header: "อนุมัติแล้ว",
                cell: (row) => row.approvedRecords,
                className: "text-right",
              },
              {
                key: "pendingRecords",
                header: "รอตรวจสอบ",
                cell: (row) => row.pendingRecords,
                className: "text-right",
              },
              {
                key: "rejectedRecords",
                header: "ไม่อนุมัติ",
                cell: (row) => row.rejectedRecords,
                className: "text-right",
              },
              {
                key: "approvedHours",
                header: "ชั่วโมงอนุมัติ",
                cell: (row) => formatHours(row.approvedHours),
                className: "text-right",
              },
            ]}
          />

          <ReportTableCard
            title="Annual Training Summary"
            description="สรุปรายเดือนของการส่งอบรม การอนุมัติ และจำนวนชั่วโมงในปีที่เลือก"
            exportLinks={[
              {
                label: "Excel",
                href: buildExportHref(
                  "annualTrainingSummary",
                  "xlsx",
                  data.filters,
                ),
              },
              {
                label: "PDF",
                href: buildExportHref(
                  "annualTrainingSummary",
                  "pdf",
                  data.filters,
                ),
              },
            ]}
            emptyMessage="ไม่พบข้อมูลสรุปประจำปีตามตัวกรองที่เลือก"
            rows={data.annualTrainingSummary}
            columns={[
              { key: "month", header: "เดือน", cell: (row) => row.monthLabel },
              {
                key: "submittedRecords",
                header: "รายการที่ส่ง",
                cell: (row) => row.submittedRecords,
                className: "text-right",
              },
              {
                key: "approvedRecords",
                header: "อนุมัติแล้ว",
                cell: (row) => row.approvedRecords,
                className: "text-right",
              },
              {
                key: "pendingRecords",
                header: "รอตรวจสอบ",
                cell: (row) => row.pendingRecords,
                className: "text-right",
              },
              {
                key: "rejectedRecords",
                header: "ไม่อนุมัติ",
                cell: (row) => row.rejectedRecords,
                className: "text-right",
              },
              {
                key: "submittedHours",
                header: "ชั่วโมงที่ส่ง",
                cell: (row) => formatHours(row.submittedHours),
                className: "text-right",
              },
              {
                key: "approvedHours",
                header: "ชั่วโมงที่อนุมัติ",
                cell: (row) => formatHours(row.approvedHours),
                className: "text-right",
              },
            ]}
          />
        </>
      ) : (
        <Card>
          <CardHeader>
            <CardTitle>ขอบเขตรายงานของฉัน</CardTitle>
            <CardDescription>
              บัญชีพนักงานสามารถดูและส่งออกได้เฉพาะประวัติการอบรมของตนเอง
            </CardDescription>
          </CardHeader>
          <CardContent>
            <Badge variant="secondary">
              สิทธิ์ปัจจุบัน: Employee Transcript Only
            </Badge>
          </CardContent>
        </Card>
      )}
    </div>
  );
}
