import IDARI from '@/data/tkgm-idari.json';
import MAH from '@/data/tkgm-mahalle.json';
import { prisma } from './db';

/** İl/ilçe tanıtım sayfaları (programatik SEO): adres slug'ları, bölge listeleri ve gerçek üretim istatistikleri. */
type Opt = { id: number; text: string };
const ST = IDARI as { il: Opt[]; ilce: Record<string, Opt[]> };
const MH = MAH as unknown as Record<string, [number, string][]>;

/** "Çatalca" → "catalca", "Kadıköy" → "kadikoy" */
export function slug(s: string) {
  return s.toLocaleLowerCase('tr-TR').replace(/[çğıöşüâîû]/g, (c) => ({ ç: 'c', ğ: 'g', ı: 'i', ö: 'o', ş: 's', ü: 'u', â: 'a', î: 'i', û: 'u' }[c]!))
    .normalize('NFD').replace(/[̀-ͯ]/g, '').replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
}
/** Türkçe bulunma eki: Ula'da, Kadıköy'de, Çatalca'da, Bodrum'da */
export function bulunma(w: string) {
  const v = (w.toLocaleLowerCase('tr-TR').match(/[aeıioöuü]/g) || ['a']).pop()!;
  const back = 'aıou'.includes(v); const hard = /[çfhkpsşt]$/i.test(w.trim());
  return `${w}'${hard ? 't' : 'd'}${back ? 'a' : 'e'}`;
}

export type Il = { id: number; ad: string; slug: string };
export type Ilce = { id: number; ad: string; slug: string; il: Il };
const ILLER: Il[] = ST.il.map((x) => ({ id: x.id, ad: x.text, slug: slug(x.text) })).sort((a, b) => a.ad.localeCompare(b.ad, 'tr'));
export const iller = () => ILLER;
export const ilBySlug = (s: string) => ILLER.find((x) => x.slug === s) ?? null;
/** TKGM bazı ilçe adlarına il adını ekler ("Kemalpaşa (Artvin)"); il zaten bilindiği için atılır. */
export function ilceler(il: Il): Ilce[] {
  return (ST.ilce[String(il.id)] || []).map((x) => { const ad = x.text.replace(/\s*\([^)]*\)$/, ''); return { id: x.id, ad, slug: slug(ad), il }; }).sort((a, b) => a.ad.localeCompare(b.ad, 'tr'));
}
export const ilceBySlug = (il: Il, s: string) => ilceler(il).find((x) => x.slug === s) ?? null;
export const mahalleler = (ilce: Ilce) => (MH[String(ilce.id)] || []).map(([, ad]) => ad).sort((a, b) => a.localeCompare(b, 'tr'));

// mahalle kimliği → ilçe kimliği (siparişler mahalle kimliği taşır; ad değil, çünkü eski kayıtlarda ı/İ bozuk olabilir)
let mahToIlce: Map<number, number> | null = null;
function ilceOfMahalle(mid: number) {
  if (!mahToIlce) { mahToIlce = new Map(); for (const [ilce, rows] of Object.entries(MH)) for (const [m] of rows) mahToIlce.set(m, Number(ilce)); }
  return mahToIlce.get(mid);
}

export type BolgeStat = { videos: number; avgArea: number | null; topNitelik: string | null };
/** Teslim edilmiş videolar, ilçe kimliğine göre. Kişisel veri içermez: yalnızca sayı, ortalama alan ve en sık nitelik. */
export async function statsByIlce(): Promise<Map<number, BolgeStat>> {
  const rows = await prisma.order.groupBy({ by: ['mahalleId', 'nitelik'], where: { status: 'DELIVERED' }, _count: true, _avg: { areaM2: true } });
  const acc = new Map<number, { n: number; areaSum: number; areaN: number; nit: Map<string, number> }>();
  for (const r of rows) {
    const ilce = ilceOfMahalle(r.mahalleId); if (ilce == null) continue;
    const a = acc.get(ilce) ?? { n: 0, areaSum: 0, areaN: 0, nit: new Map() };
    a.n += r._count; if (r._avg.areaM2) { a.areaSum += r._avg.areaM2 * r._count; a.areaN += r._count; }
    if (r.nitelik) a.nit.set(r.nitelik, (a.nit.get(r.nitelik) || 0) + r._count);
    acc.set(ilce, a);
  }
  const out = new Map<number, BolgeStat>();
  for (const [k, a] of acc) out.set(k, { videos: a.n, avgArea: a.areaN ? Math.round(a.areaSum / a.areaN) : null, topNitelik: [...a.nit].sort((x, y) => y[1] - x[1])[0]?.[0] ?? null });
  return out;
}
/** İlçe sayfası arama motorlarına ancak o ilçede gerçek bir video üretilmişse açılır (şablon tekrarı ince içerik sayılmasın) */
export const ilceIndexable = (s?: BolgeStat) => !!s && s.videos > 0;
export const BASE = '/arsa-videosu';
