import Link from "next/link";
import { requireSession } from "@/lib/auth";
import { canManageSettings } from "@/lib/rbac";
import { ACTION_LABEL, ENTITY_LABEL, auditActors, loadAuditPage, parseAuditQuery } from "@/lib/audit-view";
import { formatNumber } from "@/lib/format";
import { AuditEntryRow } from "@/components/entity-history";
import { PageHeader, EmptyState } from "@/components/ui";

export const dynamic = "force-dynamic";

type Params = { hanhdong?: string; doituong?: string; nguoi?: string; tu?: string; den?: string; q?: string; trang?: string };

export default async function AuditLogPage({ searchParams }: { searchParams: Promise<Params> }) {
  const session = await requireSession();
  const params = await searchParams;

  if (!canManageSettings(session)) {
    return (
      <>
        <PageHeader title="Nhật ký thao tác" />
        <EmptyState message="Bạn không có quyền xem nhật ký." hint="Nhật ký ghi lại ai làm gì trên hệ thống, chỉ Ban giám đốc xem được." />
      </>
    );
  }

  const query = parseAuditQuery((key) => params[key as keyof Params]);
  const [{ entries, total, page, totalPages }, actors] = await Promise.all([loadAuditPage(session.tenantId, query), auditActors(session.tenantId)]);

  const href = (patch: Record<string, string>) => {
    const next: Record<string, string> = { hanhdong: query.action, doituong: query.entity, nguoi: query.userId, tu: query.from, den: query.to, q: query.text, ...patch };
    const qs = new URLSearchParams();
    for (const [key, value] of Object.entries(next)) if (value) qs.set(key, value);
    const text = qs.toString();
    return text ? `/danh-muc/nhat-ky?${text}` : "/danh-muc/nhat-ky";
  };
  const filtered = !!(query.action || query.entity || query.userId || query.from || query.to || query.text);

  return (
    <>
      <PageHeader
        title="Nhật ký thao tác"
        subtitle="Lịch sử chỉnh sửa toàn hệ thống: ai đã tạo, sửa, xoá gì, lúc nào và giá trị thay đổi. Chỉ Ban giám đốc xem được; không ai sửa hay xoá được nhật ký."
        actions={
          <>
            <a href={`/api/xuat-excel?${href({ trang: "" }).split("?")[1] ?? ""}&loai=nhat-ky`} className="btn-ghost" download>
              Xuất Excel
            </a>
            <Link href="/danh-muc" className="btn-ghost">
              ← Danh mục
            </Link>
          </>
        }
      />

      <form action="/danh-muc/nhat-ky" className="card mb-4 grid gap-3 p-4 sm:grid-cols-2 xl:grid-cols-4">
        <div className="sm:col-span-2">
          <label className="label-caps mb-1.5 block" htmlFor="q">
            Tìm
          </label>
          <input id="q" name="q" defaultValue={query.text} className="input" placeholder="Tên, mã đơn, số điện thoại, nội dung…" maxLength={100} />
        </div>
        <div>
          <label className="label-caps mb-1.5 block" htmlFor="nguoi">
            Người thực hiện
          </label>
          <select id="nguoi" name="nguoi" defaultValue={query.userId} className="input">
            <option value="">Tất cả</option>
            {actors.map((actor) => (
              <option key={actor.id} value={actor.id}>
                {actor.name}
              </option>
            ))}
          </select>
        </div>
        <div>
          <label className="label-caps mb-1.5 block" htmlFor="hanhdong">
            Hành động
          </label>
          <select id="hanhdong" name="hanhdong" defaultValue={query.action} className="input">
            <option value="">Tất cả</option>
            {Object.entries(ACTION_LABEL).map(([value, label]) => (
              <option key={value} value={value}>
                {label}
              </option>
            ))}
          </select>
        </div>
        <div>
          <label className="label-caps mb-1.5 block" htmlFor="doituong">
            Đối tượng
          </label>
          <select id="doituong" name="doituong" defaultValue={query.entity} className="input">
            <option value="">Tất cả</option>
            {Object.entries(ENTITY_LABEL).map(([value, label]) => (
              <option key={value} value={value}>
                {label}
              </option>
            ))}
          </select>
        </div>
        <div className="grid grid-cols-2 gap-2 sm:col-span-2">
          <div>
            <label className="label-caps mb-1.5 block" htmlFor="tu">
              Từ ngày
            </label>
            <input id="tu" name="tu" type="date" defaultValue={query.from} className="input" />
          </div>
          <div>
            <label className="label-caps mb-1.5 block" htmlFor="den">
              Đến ngày
            </label>
            <input id="den" name="den" type="date" defaultValue={query.to} className="input" />
          </div>
        </div>
        <div className="flex items-end gap-2 sm:col-span-2 xl:col-span-4">
          <button type="submit" className="btn-primary">
            Lọc
          </button>
          {filtered && (
            <Link href="/danh-muc/nhat-ky" className="btn-ghost">
              Bỏ lọc
            </Link>
          )}
          <span className="ml-auto text-xs text-ink-400">{formatNumber(total)} thao tác</span>
        </div>
      </form>

      {entries.length === 0 ? (
        <EmptyState message="Chưa có thao tác nào khớp bộ lọc." hint={filtered ? "Thử bỏ bớt bộ lọc." : undefined} />
      ) : (
        <div className="card overflow-hidden">
          <ul className="divide-y divide-[var(--color-line)]">
            {entries.map((entry) => (
              <AuditEntryRow key={entry.id} entry={entry} />
            ))}
          </ul>
        </div>
      )}

      {totalPages > 1 && (
        <nav className="mt-4 flex items-center justify-center gap-3 text-sm" aria-label="Phân trang">
          {page > 1 ? (
            <Link href={href({ trang: String(page - 1) })} className="btn-ghost">
              ← Trước
            </Link>
          ) : (
            <span className="btn-ghost pointer-events-none opacity-40">← Trước</span>
          )}
          <span className="text-ink-500">
            Trang {page}/{totalPages}
          </span>
          {page < totalPages ? (
            <Link href={href({ trang: String(page + 1) })} className="btn-ghost">
              Sau →
            </Link>
          ) : (
            <span className="btn-ghost pointer-events-none opacity-40">Sau →</span>
          )}
        </nav>
      )}

      <p className="mt-3 text-xs text-ink-400">
        Nhật ký không bao giờ ghi mật khẩu, kể cả dạng đã băm. Thao tác xoá lưu lại mã và giá trị của bản ghi bị xoá, vì sau khi xoá không còn gì để đối chiếu.
      </p>
    </>
  );
}
