import type { JSX } from "react"
import Link from "next/link"
import { PlusCircle, BarChart3, ClipboardList } from "lucide-react"
import { getTranslations } from "next-intl/server"
import { Button } from "@/shared/components/ui/button"
import { EmptyState } from "@/shared/components/ui/empty-state"
import { ListPagination, computePagination } from "@/shared/components/ui/list-pagination"
import { requirePermission, getAuthContext } from "@/shared/lib/auth-guard"
import { Permissions } from "@/shared/types/permissions"
import { getParam, type SearchParams } from "@/shared/lib/search-params"
import { getTeacherClasses } from "@/modules/classes/data-access"
import { getAttendanceRecords } from "@/modules/attendance/data-access"
import { AttendanceFilters } from "@/modules/attendance/components/attendance-filters"
import { AttendanceRecordList } from "@/modules/attendance/components/attendance-record-list"
import { AttendancePageLayout } from "@/modules/attendance/components/attendance-page-layout"
import type { AttendanceStatus } from "@/modules/attendance/types"

export const dynamic = "force-dynamic"

const VALID_STATUSES: ReadonlySet<string> = new Set([
  "present",
  "absent",
  "late",
  "early_leave",
  "excused",
])

function parseAttendanceStatus(v?: string): AttendanceStatus | undefined {
  return v && VALID_STATUSES.has(v) ? (v as AttendanceStatus) : undefined
}

const PAGE_SIZE = 20

export default async function TeacherAttendancePage({
  searchParams,
}: {
  searchParams: Promise<SearchParams>
}): Promise<JSX.Element> {
  const sp = await searchParams
  await requirePermission(Permissions.ATTENDANCE_READ)
  const ctx = await getAuthContext()
  const t = await getTranslations("attendance")

  const classId = getParam(sp, "classId")
  const status = getParam(sp, "status")
  const date = getParam(sp, "date")

  const [classes, result] = await Promise.all([
    getTeacherClasses(),
    getAttendanceRecords({
      scope: ctx.dataScope,
      currentUserId: ctx.userId,
      classId: classId && classId !== "all" ? classId : undefined,
      status: status && status !== "all" ? parseAttendanceStatus(status) : undefined,
      date: date && date.length > 0 ? date : undefined,
    }),
  ])
  const classOptions = classes.map((c) => ({ id: c.id, name: c.name }))

  // 分页计算：使用后端返回的 total/totalPages，避免基于截断数据计算
  const { page } = computePagination(sp, PAGE_SIZE)
  const total = result.total
  const totalPages = result.totalPages
  const currentPage = Math.min(page, totalPages)
  const hasFilters = Boolean(classId || status || date)

  const header = (
    <div className="flex items-center justify-between space-y-2">
      <div>
        <h1 className="text-2xl font-bold tracking-tight">{t("title.teacherRecords")}</h1>
        <p className="text-muted-foreground">{t("description.teacherRecords")}</p>
      </div>
      <div className="flex items-center gap-2">
        <Button asChild variant="outline">
          <Link href="/teacher/attendance/stats">
            <BarChart3 className="mr-2 h-4 w-4" aria-hidden="true" />
            {t("actions.stats")}
          </Link>
        </Button>
        <Button asChild>
          <Link href="/teacher/attendance/sheet">
            <PlusCircle className="mr-2 h-4 w-4" aria-hidden="true" />
            {t("actions.record")}
          </Link>
        </Button>
      </div>
    </div>
  )

  return (
    <AttendancePageLayout
      header={header}
      filters={<AttendanceFilters classes={classOptions} />}
    >
      {result.items.length === 0 && !hasFilters ? (
        <EmptyState
          title={t("list.empty")}
          description={t("list.emptyTeacherDescription")}
          icon={ClipboardList}
          action={{
            label: t("actions.record"),
            href: "/teacher/attendance/sheet",
          }}
        />
      ) : (
        <div className="space-y-4">
          <AttendanceRecordList records={result.items} />
          {total > 0 ? (
            <ListPagination
              page={currentPage}
              pageSize={PAGE_SIZE}
              total={total}
              totalPages={totalPages}
              basePath="/teacher/attendance"
              searchParams={sp}
              itemLabel={t("stats.totalRecords")}
            />
          ) : null}
        </div>
      )}
    </AttendancePageLayout>
  )
}
