// app/admin/manual/page.tsx
// Logged manual-entry path (admin.md section 2.7). The ONE path that mints
// tickets without a webhook: for genuine offline / direct-Yape money during a
// live, a corporate or cash donation, or a buyer helped by phone. Operator+ only,
// requires a proof reference, flagged rail = manual everywhere, always audited.
// Explicitly framed as a controlled exception, NOT a primary rail.

import * as React from "react";
import { redirect } from "next/navigation";
import { requireRole, AuthError } from "@/lib/auth";
import { listRaffles } from "@/app/admin/_lib/queries";
import { RaffleSwitcher } from "@/components/admin/RaffleSwitcher";
import { ManualEntryForm } from "@/components/admin/ManualEntryForm";
import { Card } from "@/components/ui";

export const dynamic = "force-dynamic";

export default async function ManualEntryPage({
  searchParams,
}: {
  searchParams: Promise<{ raffle?: string }>;
}) {
  // Operator+ gate (manual entry mints chances; viewers cannot reach it).
  try {
    await requireRole("operator");
  } catch (err) {
    if (err instanceof AuthError) {
      if (err.status === 401) redirect("/admin/login");
      // 403: authenticated but under-roled.
      return (
        <div>
          <h1 className="font-impact text-heading-lg font-bold text-ink-strong">
            Entrada manual
          </h1>
          <p className="mt-4 font-body text-body-lg text-primary">
            No tienes permisos para registrar entradas manuales. Se requiere rol
            de operador o superior.
          </p>
        </div>
      );
    }
    throw err;
  }

  const raffles = await listRaffles();
  if (raffles.length === 0) {
    return (
      <div>
        <h1 className="font-impact text-heading-lg font-bold text-ink-strong">
          Entrada manual
        </h1>
        <p className="mt-4 font-body text-body-lg text-muted">
          Aún no hay sorteos creados.
        </p>
      </div>
    );
  }

  const { raffle: raffleParam } = await searchParams;
  const selected = raffles.find((r) => r.id === raffleParam) ?? raffles[0];

  return (
    <div className="flex flex-col gap-lg">
      <div className="flex flex-wrap items-center justify-between gap-md">
        <h1 className="font-impact text-heading-lg font-bold text-ink-strong">
          Entrada manual
        </h1>
        <RaffleSwitcher
          raffles={raffles.map((r) => ({ id: r.id, name: r.name, status: r.status }))}
          selectedId={selected.id}
        />
      </div>

      <Card elevation="flat" className="border border-primary p-lg">
        <p className="font-body text-body-md text-ink-strong">
          Esta es una excepción controlada para dinero recibido fuera del checkout
          (Yape directo en un live, donación corporativa o en efectivo, compra
          asistida por teléfono). No es un canal principal. Cada registro queda
          marcado como rail manual y se guarda en el log de auditoría con tu
          usuario. Exige un comprobante (número de operación, depósito o nota).
        </p>
      </Card>

      <ManualEntryForm raffleId={selected.id} raffleName={selected.name} />
    </div>
  );
}
