import { chatGPTSignOutPath, requireChatGPTUser } from "@/app/chatgpt-auth";
import { AdminDashboard } from "./admin-dashboard";
import { ensureDatabase, isAdminEmail, publicSettings } from "@/lib/platform";

export const dynamic = "force-dynamic";

export default async function AdminPage() {
  const user = await requireChatGPTUser("/admin");
  if (!(await isAdminEmail(user.email))) {
    return (
      <main className="access-page">
        <span className="brand-mark">L</span>
        <h1>Admin access required</h1>
        <p>{user.email} is signed in, but is not listed as a Project Loyd administrator.</p>
        <a href={chatGPTSignOutPath("/admin")}>Sign in with another account</a>
      </main>
    );
  }

  const DB = await ensureDatabase();
  const [settings, today, yesterday, transactions, media] = await Promise.all([
    DB.prepare("SELECT * FROM settings WHERE id = 1").first<Record<string, unknown>>(),
    DB.prepare(`SELECT COUNT(*) AS transaction_count,
      COALESCE(SUM(CASE WHEN status IN ('SUCCESS','COMPLETED') THEN amount ELSE 0 END), 0) AS earn
      FROM transactions WHERE date(datetime(created_at, '+3 hours')) = date('now', '+3 hours')`)
      .first<{ transaction_count: number; earn: number }>(),
    DB.prepare(`SELECT COUNT(*) AS transaction_count,
      COALESCE(SUM(CASE WHEN status IN ('SUCCESS','COMPLETED') THEN amount ELSE 0 END), 0) AS earn
      FROM transactions WHERE date(datetime(created_at, '+3 hours')) = date('now', '+3 hours', '-1 day')`)
      .first<{ transaction_count: number; earn: number }>(),
    DB.prepare(`SELECT order_id, phone, amount, currency, status, channel, reference, created_at
      FROM transactions ORDER BY created_at DESC LIMIT 20`)
      .all<Record<string, unknown>>(),
    DB.prepare("SELECT id, filename, sort_order FROM media ORDER BY sort_order ASC, created_at ASC")
      .all<{ id: string; filename: string; sort_order: number }>(),
  ]);

  return (
    <AdminDashboard
      email={user.email}
      signOutUrl={chatGPTSignOutPath("/")}
      settings={publicSettings(settings || {})}
      today={{ count: Number(today?.transaction_count || 0), earn: Number(today?.earn || 0) }}
      yesterday={{ count: Number(yesterday?.transaction_count || 0), earn: Number(yesterday?.earn || 0) }}
      transactions={transactions.results.map((row) => ({
        orderId: String(row.order_id), phone: String(row.phone), amount: Number(row.amount),
        currency: String(row.currency), status: String(row.status), channel: row.channel ? String(row.channel) : "—",
        reference: row.reference ? String(row.reference) : "—", createdAt: String(row.created_at),
      }))}
      media={media.results.map((item) => ({ ...item, url: `/api/media/${item.id}` }))}
    />
  );
}
