import Link from "next/link"
import { ChevronLeft, ChevronRight } from "lucide-react"

import { Button } from "@/shared/components/ui/button"

/**
 * 服务端列表分页组件（基于 URL searchParams 的 Link 导航）。
 *
 * 与 `pagination.tsx` 的区别：
 * - `pagination.tsx` 通过 `onPageChange` 回调导航，适用于客户端分页（如 audit 日志表）。
 * - 本组件通过 `<Link>` 渲染分页按钮，适用于服务端渲染的列表页（URL 驱动分页）。
 *
 * 注意：本文件不使用 "use client" 指令，因为：
 * 1. `ListPagination` 组件仅使用 `Link`、`Button` 和图标，无需客户端交互
 * 2. `computePagination` 和 `paginate` 是纯工具函数，需要被服务端组件直接调用
 *
 * 使用方式：
 * ```tsx
 * <ListPagination
 *   page={page}
 *   totalPages={totalPages}
 *   total={total}
 *   pageSize={pageSize}
 *   basePath="/teacher/homework/assignments"
 *   searchParams={sp}
 * />
 * ```
 */
interface ListPaginationProps {
  /** 当前页码（从 1 开始） */
  page: number
  /** 每页条数 */
  pageSize: number
  /** 总条数 */
  total: number
  /** 总页数 */
  totalPages: number
  /** 基础路径，如 "/teacher/homework/assignments" */
  basePath: string
  /** 当前搜索参数（会保留除 page 外的所有参数） */
  searchParams: Record<string, string | string[] | undefined>
  /** 条目标签（默认 "条"） */
  itemLabel?: string
}

export function ListPagination({
  page,
  pageSize,
  total,
  totalPages,
  basePath,
  searchParams,
  itemLabel = "条",
}: ListPaginationProps) {
  const start = total === 0 ? 0 : (page - 1) * pageSize + 1
  const end = Math.min(page * pageSize, total)

  const buildHref = (targetPage: number): string => {
    const params = new URLSearchParams()
    for (const [key, value] of Object.entries(searchParams)) {
      if (key === "page") continue
      if (typeof value === "string") {
        params.set(key, value)
      } else if (Array.isArray(value)) {
        for (const v of value) params.append(key, v)
      }
    }
    if (targetPage > 1) {
      params.set("page", String(targetPage))
    }
    const qs = params.toString()
    return qs ? `${basePath}?${qs}` : basePath
  }

  const hasPrev = page > 1
  const hasNext = page < totalPages

  return (
    <div className="flex items-center justify-between px-2 py-4">
      <div className="text-sm text-muted-foreground">
        {total > 0 ? (
          <>
            显示 <span className="font-medium">{start}</span>-
            <span className="font-medium">{end}</span>，共{" "}
            <span className="font-medium">{total}</span> {itemLabel}
          </>
        ) : (
          `暂无${itemLabel}`
        )}
      </div>
      <div className="flex items-center space-x-2">
        <span className="text-sm font-medium">
          第 {page} / {Math.max(totalPages, 1)} 页
        </span>
        {hasPrev ? (
          <Button asChild variant="outline" className="h-8 w-8 p-0" aria-label="上一页">
            <Link href={buildHref(page - 1)}>
              <ChevronLeft className="h-4 w-4" />
            </Link>
          </Button>
        ) : (
          <Button variant="outline" className="h-8 w-8 p-0" disabled aria-label="上一页">
            <ChevronLeft className="h-4 w-4" />
          </Button>
        )}
        {hasNext ? (
          <Button asChild variant="outline" className="h-8 w-8 p-0" aria-label="下一页">
            <Link href={buildHref(page + 1)}>
              <ChevronRight className="h-4 w-4" />
            </Link>
          </Button>
        ) : (
          <Button variant="outline" className="h-8 w-8 p-0" disabled aria-label="下一页">
            <ChevronRight className="h-4 w-4" />
          </Button>
        )}
      </div>
    </div>
  )
}

/** 计算分页参数的工具函数（供服务端组件使用） */
export function computePagination(
  searchParams: Record<string, string | string[] | undefined>,
  defaultPageSize = 10
): { page: number; pageSize: number } {
  const pageParam = typeof searchParams.page === "string" ? searchParams.page : undefined
  const pageSizeParam = typeof searchParams.pageSize === "string" ? searchParams.pageSize : undefined
  const page = Math.max(1, Number(pageParam) || 1)
  const pageSize = Math.min(100, Math.max(1, Number(pageSizeParam) || defaultPageSize))
  return { page, pageSize }
}

/** 对数组进行分页切片 */
export function paginate<T>(items: T[], page: number, pageSize: number): T[] {
  const start = (page - 1) * pageSize
  return items.slice(start, start + pageSize)
}
