import Link from 'next/link';
import { prisma } from '@/lib/db';
import { templateById } from '@/lib/templates';
import { voiceById } from '@/lib/voices';
import { planById } from '@/lib/plans';
import { StatusBadge } from '@/components/StatusBadge';
import { AHead, Bars, Dist, Panel, Stat } from '@/components/admin/ui';
import { PERIODS, day, dt, dur, n, pct, since, tryFmt } from '@/lib/admin';
import { apShort } from '@/lib/ap';

export default async function Overview({ searchParams }: { searchParams: Promise<{ d?: string }> }) {
  const { d = '30' } = await searchParams;
  const from = since(d);
  const inP = from ? { createdAt: { gte: from } } : {};
  const days = d === '0' ? 90 : d === '1' ? 14 : Number(d);
  // grafik: İstanbul gece yarısına hizalı tam günler
  const seriesFrom = new Date(since('1')!.getTime() - (days - 1) * 86400_000);
  const stale = new Date(Date.now() - 45 * 60_000);

  const [orders, byStatus, rev, paysAll, paysOk, users, verified, credits, delivered, jobs, byTpl, byPlan, byIl, byVoice,
    dOrders, dRev, failed, stuck, latest, signups, lastDone, refUsers] = await Promise.all([
    prisma.order.count({ where: inP }),
    prisma.order.groupBy({ by: ['status'], where: inP, _count: true }),
    prisma.payment.aggregate({ where: { ...inP, status: 'succeeded', plan: { not: 'admin' } }, _sum: { amount: true }, _count: true }),
    prisma.payment.count({ where: { ...inP, plan: { not: 'admin' } } }),
    prisma.payment.count({ where: { ...inP, plan: { not: 'admin' }, status: 'succeeded' } }),
    prisma.user.count({ where: inP }),
    prisma.user.count({ where: { ...inP, emailVerifiedAt: { not: null } } }),
    prisma.user.aggregate({ _sum: { credits: true } }),
    prisma.order.findMany({ where: { ...inP, status: 'DELIVERED', deliveredAt: { not: null } }, select: { createdAt: true, deliveredAt: true }, take: 3000, orderBy: { createdAt: 'desc' } }),
    prisma.job.groupBy({ by: ['status'], _count: true }),
    prisma.order.groupBy({ by: ['template'], where: inP, _count: true }),
    prisma.order.groupBy({ by: ['plan'], where: inP, _count: true }),
    prisma.order.groupBy({ by: ['il'], where: inP, _count: true, orderBy: { _count: { il: 'desc' } }, take: 10 }),
    prisma.order.groupBy({ by: ['voice'], where: inP, _count: true }),
    prisma.$queryRaw<{ d: string; v: number }[]>`SELECT to_char("createdAt" + interval '3 hours', 'YYYY-MM-DD') d, count(*)::int v FROM "Order" WHERE "createdAt" >= ${seriesFrom} GROUP BY 1`,
    prisma.$queryRaw<{ d: string; v: number }[]>`SELECT to_char("createdAt" + interval '3 hours', 'YYYY-MM-DD') d, coalesce(sum(amount),0)::int v FROM "Payment" WHERE status = 'succeeded' AND plan <> 'admin' AND "createdAt" >= ${seriesFrom} GROUP BY 1`,
    prisma.order.findMany({ where: { status: 'FAILED' }, orderBy: { updatedAt: 'desc' }, take: 6, select: { id: true, code: true, error: true, updatedAt: true } }),
    prisma.order.findMany({ where: { status: 'RENDERING', updatedAt: { lt: stale } }, orderBy: { updatedAt: 'asc' }, take: 6, select: { id: true, code: true, progress: true, progressMsg: true, updatedAt: true, claimedBy: true } }),
    prisma.order.findMany({ orderBy: { createdAt: 'desc' }, take: 8, select: { id: true, code: true, ada: true, parsel: true, mahalle: true, ilce: true, status: true, createdAt: true, user: { select: { email: true } } } }),
    prisma.user.findMany({ orderBy: { createdAt: 'desc' }, take: 6, select: { id: true, email: true, name: true, company: true, createdAt: true, emailVerifiedAt: true } }),
    prisma.order.findFirst({ where: { status: 'DELIVERED' }, orderBy: { deliveredAt: 'desc' }, select: { deliveredAt: true } }),
    prisma.user.count({ where: { ...inP, referredById: { not: null } } }),
  ]);

  const st = (k: string) => byStatus.find((x) => x.status === k)?._count ?? 0;
  const jb = (k: string) => jobs.find((x) => x.status === k)?._count ?? 0;
  const times = delivered.map((o) => o.deliveredAt!.getTime() - o.createdAt.getTime()).sort((a, b) => a - b);
  const median = times.length ? times[Math.floor(times.length / 2)] : 0;
  const finished = st('DELIVERED') + st('FAILED');
  const series = (rows: { d: string; v: number }[]) => Array.from({ length: days }, (_, i) => {
    const t = new Date(seriesFrom.getTime() + i * 86400_000 + 3 * 3600_000); const k = t.toISOString().slice(0, 10);
    return { label: day(new Date(t.getTime() - 3 * 3600_000)), v: rows.find((r) => r.d === k)?.v ?? 0 };
  });
  const revenue = rev._sum.amount ?? 0;

  return (
    <div className="space-y-6">
      <AHead kicker="Yönetim" title="Genel bakış">
        <span className="flex bg-white">{PERIODS.map(([k, l]) => <Link key={k} href={`/krtf1krtf?d=${k}`} className={`px-3 py-2 text-[13px] font-semibold ${d === k ? 'bg-ink text-white' : 'hover:bg-paper-3'}`}>{l}</Link>)}</span>
      </AHead>

      <div className="grid grid-cols-2 gap-2 md:grid-cols-4 xl:grid-cols-8">
        <Stat k="Ciro" v={tryFmt(revenue)} sub={`${n(rev._count)} ödeme · ort. ${rev._count ? tryFmt(revenue / rev._count) : '—'}`} />
        <Stat k="Sipariş" v={n(orders)} sub={`${n(st('PENDING_PAYMENT'))} ödeme bekliyor`} href="/krtf1krtf/siparisler" />
        <Stat k="Teslim" v={n(st('DELIVERED'))} sub={`başarı ${pct(st('DELIVERED'), finished)}`} tone="good" />
        <Stat k="Başarısız" v={n(st('FAILED'))} sub={`oran ${pct(st('FAILED'), finished)}`} tone={st('FAILED') ? 'bad' : undefined} href="/krtf1krtf/siparisler?s=FAILED" />
        <Stat k="Ödeme dönüşümü" v={pct(paysOk, paysAll)} sub={`${n(paysOk)} / ${n(paysAll)} ödeme oturumu`} href="/krtf1krtf/odemeler" />
        <Stat k="Üretim süresi" v={dur(median)} sub="sipariş → teslim, ortanca" />
        <Stat k="Yeni kullanıcı" v={n(users)} sub={`doğrulanan ${pct(verified, users)} · davetle ${n(refUsers)}`} href="/krtf1krtf/kullanicilar" />
        <Stat k="Kullanılmamış kredi" v={n(credits._sum.credits ?? 0)} sub="tüm hesaplarda bekleyen" />
      </div>

      <div className="grid gap-2 lg:grid-cols-2">
        <Panel title={`Günlük sipariş · son ${days} gün`}><Bars data={series(dOrders)} fmt={(x) => `${x} sipariş`} /></Panel>
        <Panel title={`Günlük ciro · son ${days} gün`}><Bars data={series(dRev)} fmt={(x) => tryFmt(x)} color="#FF6A1F" /></Panel>
      </div>

      <div className="grid gap-2 md:grid-cols-2 xl:grid-cols-4">
        <Panel title="Üretim kuyruğu" action={<Link href="/krtf1krtf/kuyruk" className="text-[12px] underline">Ayrıntı</Link>}>
          <div className="grid grid-cols-2 gap-3 text-[13px]">
            {([['Kuyrukta', 'queued'], ['Üretiliyor', 'running'], ['Harici ajan', 'external'], ['Ölü kuyruk', 'dead']] as const).map(([l, k]) => (
              <div key={k}><div className="tag">{l}</div><div className={`num text-[22px] font-extrabold ${k === 'dead' && jb(k) ? 'text-survey' : ''}`}>{jb(k)}</div></div>
            ))}
          </div>
          <p className="mt-3 text-[12px] text-ink-soft">Son teslim: {dt(lastDone?.deliveredAt)}</p>
        </Panel>
        <Panel title="Şablon"><Dist rows={byTpl.map((x) => ({ label: templateById(x.template).name, v: x._count })).sort((a, b) => b.v - a.v)} /></Panel>
        <Panel title="Paket"><Dist rows={byPlan.map((x) => ({ label: planById(x.plan)?.name || x.plan, v: x._count })).sort((a, b) => b.v - a.v)} /></Panel>
        <Panel title="Ses"><Dist rows={byVoice.map((x) => ({ label: voiceById(x.voice).name, v: x._count })).sort((a, b) => b.v - a.v)} /></Panel>
      </div>

      <div className="grid gap-2 lg:grid-cols-3">
        <Panel title="İllere göre sipariş (ilk 10)"><Dist rows={byIl.map((x) => ({ label: x.il, v: x._count, href: `/krtf1krtf/siparisler?q=${encodeURIComponent(x.il)}` }))} /></Panel>
        <Panel title="Dikkat: takılan üretimler" action={<span className="text-[11.5px] text-ink-soft">45 dk+ güncellenmeyen</span>} pad={false}>
          {stuck.length ? <ul className="divide-y divide-ink/5">{stuck.map((o) => (
            <li key={o.id}><Link href={`/krtf1krtf/siparisler/${o.id}`} className="block px-4 py-2 text-[13px] hover:bg-paper-2"><b className="font-mono">{o.code}</b> %{o.progress} · {o.progressMsg}{o.claimedBy ? ` · ${o.claimedBy}` : ''}<span className="block text-[11.5px] text-ink-soft">son güncelleme {dt(o.updatedAt)}</span></Link></li>
          ))}</ul> : <p className="px-4 py-3 text-[13px] text-ink-soft">Takılan üretim yok.</p>}
        </Panel>
        <Panel title="Son başarısızlar" action={<Link href="/krtf1krtf/siparisler?s=FAILED" className="text-[12px] underline">Tümü</Link>} pad={false}>
          {failed.length ? <ul className="divide-y divide-ink/5">{failed.map((o) => (
            <li key={o.id}><Link href={`/krtf1krtf/siparisler/${o.id}`} className="block px-4 py-2 text-[13px] hover:bg-paper-2"><b className="font-mono">{o.code}</b> <span className="text-ink-soft">{dt(o.updatedAt)}</span><span className="block truncate text-[12px] text-survey-dark">{o.error || 'hata kaydı yok'}</span></Link></li>
          ))}</ul> : <p className="px-4 py-3 text-[13px] text-ink-soft">Başarısız sipariş yok.</p>}
        </Panel>
      </div>

      <div className="grid gap-2 lg:grid-cols-[2fr_1fr]">
        <Panel title="Son siparişler" action={<Link href="/krtf1krtf/siparisler" className="text-[12px] underline">Tümü</Link>} pad={false}>
          <ul className="divide-y divide-ink/5">{latest.map((o) => (
            <li key={o.id}><Link href={`/krtf1krtf/siparisler/${o.id}`} className="grid grid-cols-[1fr_auto] items-center gap-3 px-4 py-2 text-[13px] hover:bg-paper-2">
              <span className="min-w-0"><b>{apShort(o.ada, o.parsel)}</b> {o.mahalle}, {o.ilce} <span className="block truncate text-[12px] text-ink-soft">{o.code} · {o.user.email} · {dt(o.createdAt)}</span></span><StatusBadge s={o.status} />
            </Link></li>
          ))}</ul>
        </Panel>
        <Panel title="Son kayıtlar" action={<Link href="/krtf1krtf/kullanicilar" className="text-[12px] underline">Tümü</Link>} pad={false}>
          <ul className="divide-y divide-ink/5">{signups.map((u) => (
            <li key={u.id}><Link href={`/krtf1krtf/kullanicilar/${u.id}`} className="block px-4 py-2 text-[13px] hover:bg-paper-2"><b>{u.company || u.name}</b>{!u.emailVerifiedAt && <span className="ml-1 bg-paper-3 px-1 text-[11px]">doğrulanmadı</span>}<span className="block truncate text-[12px] text-ink-soft">{u.email} · {dt(u.createdAt)}</span></Link></li>
          ))}</ul>
        </Panel>
      </div>
    </div>
  );
}
