import Link from 'next/link';

/** Sayfa başlığı + sağda eylemler */
export function AHead({ kicker, title, children }: { kicker?: React.ReactNode; title: React.ReactNode; children?: React.ReactNode }) {
  return (
    <div className="flex flex-wrap items-end justify-between gap-3 border-b border-ink/10 pb-4">
      <div>{kicker && <div className="tag">{kicker}</div>}<h1 className="text-[26px] font-extrabold leading-tight tracking-[-0.02em]">{title}</h1></div>
      {children && <div className="flex flex-wrap items-center gap-2">{children}</div>}
    </div>
  );
}

/** Sayı kartı: değer, alt açıklama, isteğe bağlı uyarı tonu */
export function Stat({ k, v, sub, tone, href }: { k: string; v: React.ReactNode; sub?: React.ReactNode; tone?: 'warn' | 'bad' | 'good'; href?: string }) {
  const c = tone === 'bad' ? 'border-l-survey' : tone === 'warn' ? 'border-l-signal' : tone === 'good' ? 'border-l-ok' : 'border-l-transparent';
  const body = (<><div className="tag">{k}</div><div className="num mt-1.5 text-[26px] font-extrabold leading-none">{v}</div>{sub && <div className="mt-1.5 text-[12px] text-ink-soft">{sub}</div>}</>);
  return href ? <Link href={href} className={`block border-l-4 bg-white p-4 hover:bg-paper-2 ${c}`}>{body}</Link> : <div className={`border-l-4 bg-white p-4 ${c}`}>{body}</div>;
}

export function Panel({ title, action, children, pad = true }: { title: string; action?: React.ReactNode; children: React.ReactNode; pad?: boolean }) {
  return (
    <section className="bg-white">
      <div className="flex items-center justify-between gap-3 border-b border-ink/10 px-4 py-2.5"><h2 className="tag !text-ink">{title}</h2>{action}</div>
      <div className={pad ? 'p-4' : ''}>{children}</div>
    </section>
  );
}

/** Günlük seri: çubuk grafik (SVG, sunucuda çizilir). İkinci seri varsa üst üste değil yan yana. */
export function Bars({ data, fmt = (x) => String(x), color = '#111311', height = 120 }: { data: { label: string; v: number }[]; fmt?: (x: number) => string; color?: string; height?: number }) {
  const max = Math.max(1, ...data.map((d) => d.v)); const w = 100 / Math.max(1, data.length);
  const total = data.reduce((a, d) => a + d.v, 0);
  return (
    <div>
      <svg viewBox={`0 0 100 ${height}`} preserveAspectRatio="none" className="block w-full" style={{ height }} role="img" aria-label={`Toplam ${fmt(total)}`}>
        {[0.25, 0.5, 0.75].map((g) => <line key={g} x1="0" x2="100" y1={height * g} y2={height * g} stroke="#111311" strokeOpacity=".07" strokeWidth=".3" vectorEffect="non-scaling-stroke" />)}
        {data.map((d, i) => { const h = (d.v / max) * (height - 4); return <rect key={i} x={i * w + w * 0.15} width={w * 0.7} y={height - h} height={h} fill={color}><title>{`${d.label}: ${fmt(d.v)}`}</title></rect>; })}
      </svg>
      <div className="mt-1 flex justify-between text-[11px] text-ink-soft"><span>{data[0]?.label}</span><span>en yüksek {fmt(max)}</span><span>{data.at(-1)?.label}</span></div>
    </div>
  );
}

/** Dağılım listesi: etiket, yatay çubuk, değer */
export function Dist({ rows, fmt = (x) => x.toLocaleString('tr-TR'), empty = 'Veri yok' }: { rows: { label: string; v: number; href?: string }[]; fmt?: (x: number) => string; empty?: string }) {
  if (!rows.length) return <p className="text-[13px] text-ink-soft">{empty}</p>;
  const max = Math.max(...rows.map((r) => r.v)); const tot = rows.reduce((a, r) => a + r.v, 0);
  return (
    <ul className="space-y-1.5">
      {rows.map((r) => {
        const lbl = r.href ? <Link href={r.href} className="hover:underline">{r.label}</Link> : r.label;
        return (
          <li key={r.label} className="grid grid-cols-[minmax(0,104px)_minmax(48px,1fr)_auto] items-center gap-2 text-[13px]">
            <span className="truncate">{lbl}</span>
            <span className="h-2.5 bg-paper-2"><span className="block h-full bg-signal" style={{ width: `${(r.v / max) * 100}%` }} /></span>
            <span className="num w-[64px] text-right">{fmt(r.v)} <span className="text-[11px] text-ink-soft">%{Math.round((r.v / tot) * 100)}</span></span>
          </li>
        );
      })}
    </ul>
  );
}

export function Pager({ page, total, size, link }: { page: number; total: number; size: number; link: (p: number) => string }) {
  const pages = Math.max(1, Math.ceil(total / size));
  return (
    <div className="flex items-center justify-between gap-3 px-1 py-3 text-[13px]">
      <span className="text-ink-soft">{total.toLocaleString('tr-TR')} kayıt · sayfa {page}/{pages}</span>
      <span className="flex gap-1">
        {page > 1 ? <Link href={link(page - 1)} className="btn-line btn-sm">‹ Önceki</Link> : <span className="btn-line btn-sm opacity-40">‹ Önceki</span>}
        {page < pages ? <Link href={link(page + 1)} className="btn-line btn-sm">Sonraki ›</Link> : <span className="btn-line btn-sm opacity-40">Sonraki ›</span>}
      </span>
    </div>
  );
}

/** GET filtre formu kabı (sayfa yenilenerek çalışır, JS gerektirmez) */
export function Filters({ children, reset }: { children: React.ReactNode; reset: string }) {
  return (
    <form className="flex flex-wrap items-end gap-2 bg-white p-3">
      {children}
      <button className="btn-ink btn-sm">Uygula</button>
      <Link href={reset} className="btn-ghost btn-sm">Temizle</Link>
    </form>
  );
}
export const fieldSm = 'h-9 border border-ink/25 bg-white px-2 text-[13.5px] outline-none focus:border-ink';

/** Tanım listesi */
export function KV({ rows }: { rows: [string, React.ReactNode][] }) {
  return (
    <dl>
      {rows.filter(([, v]) => v !== null && v !== undefined && v !== '').map(([k, v]) => (
        <div key={k} className="grid grid-cols-[130px_1fr] gap-3 border-b border-ink/5 py-1.5 last:border-0"><dt className="tag pt-0.5">{k}</dt><dd className="min-w-0 break-words text-[13.5px]">{v}</dd></div>
      ))}
    </dl>
  );
}
