/**
 * Investigative recipes — pre-built query showcases for /retete.
 * Each recipe runs a SQL query and renders results in a templated layout.
 * Sharable URL, OG meta tags auto-generated from the recipe title + first row.
 */
import { query } from './db.js';

export interface RecipeRow {
  primary: string; // headline (e.g. authority name, supplier name, UAT name)
  primaryHref?: string; // optional link
  secondary?: string; // sub-headline (CUI, county)
  metric: string; // formatted metric value
  metricRaw: number;
  detail?: string; // tertiary line
  badge?: { label: string; tone?: 'risk' | 'warn' | 'ok' };
}

export interface Recipe {
  slug: string;
  title: string;
  teaser: string;
  description: string;
  icon: string;
  category: 'concentrare' | 'directa' | 'modificate' | 'temporal' | 'reach' | 'cpv' | 'firme' | 'politicieni' | 'red-flags';
  metricLabel: string;
  fetch: () => Promise<RecipeRow[]>;
  whyItMatters: string;
}

function fmtRON(v: number): string {
  if (!Number.isFinite(v) || v <= 0) return '0';
  if (v >= 1_000_000_000) return `${(v / 1_000_000_000).toFixed(1)} mld`;
  if (v >= 1_000_000) return `${(v / 1_000_000).toFixed(1)} mil`;
  if (v >= 1_000) return `${(v / 1_000).toFixed(0)}K`;
  return Math.round(v).toString();
}

function fmtPct(v: number): string {
  return `${(v * 100).toFixed(0)}%`;
}

function normCui(cui: string | null): string {
  if (!cui) return '';
  return cui.toUpperCase().replace(/^RO/, '').replace(/\s+/g, '').trim();
}

// ─────────────────────────────────────────────────────────────────────────────

const directMari: Recipe = {
  slug: 'achizitii-directe-mari',
  title: 'Cele mai mari achiziții directe',
  teaser: 'Top 50 contracte atribuite direct (fără competiție publică), ordonate după valoare.',
  description: 'În principiu, achiziția directă e permisă doar sub un prag legal (270K lei produse / 900K lei lucrări, 2026). Contractele de mai jos sunt achiziții directe la cele mai mari valori — cele aflate peste prag merită verificate manual.',
  icon: '⚡',
  category: 'directa',
  metricLabel: 'Valoare RON',
  whyItMatters: 'Achiziția directă peste prag legal e o încălcare a Legii 98/2016, art. 7. Sub prag, repetarea pe același furnizor poate semnala "fragmentare" — o tehnică pentru evitarea procedurii competitive.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        a.id, a.title, a.publication_date,
        a.awarded_value::numeric AS value,
        a.authority_name, a.authority_cui,
        a.supplier_name, a.supplier_cui,
        cl.county AS authority_county
      FROM seap.announcements a
      LEFT JOIN seap.cui_location cl ON cl.cui = a.authority_cui
      WHERE a.type = 'da'
        AND a.awarded_value IS NOT NULL
      ORDER BY a.awarded_value DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.title || `Anunț #${r.id}`,
      primaryHref: `/anunt/${r.id}`,
      secondary: `${r.authority_name || '?'} ${r.authority_county ? `· ${r.authority_county}` : ''}`,
      detail: r.supplier_name ? `→ ${r.supplier_name}` : undefined,
      metric: `${fmtRON(Number(r.value))} RON`,
      metricRaw: Number(r.value),
      badge: { label: 'achiziție directă', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const modificateMult: Recipe = {
  slug: 'contracte-modificate',
  title: 'Contracte cu amendamente publicate',
  teaser: 'Anunțuri unde valoarea sau scopul a fost modificat ulterior — semn potențial de "scope creep" sau prelungire abuzivă.',
  description: 'Modificările contractuale sunt legale (Legea 98/2016 art. 221), dar limitate la 50% din valoarea inițială. Modificările repetate pe același contract sau peste prag indică probleme de planificare sau, mai grav, deturnare.',
  icon: '📝',
  category: 'modificate',
  metricLabel: 'Valoare modificată',
  whyItMatters: 'Schema clasică: câștigi licitație ieftin, apoi modifici contractul pentru valori mai mari sub justificări tehnice. EU SMSC indicator: rata de modificare > 15% e flag de gestiune slabă.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        a.id, a.title, a.publication_date,
        a.awarded_value::numeric AS value,
        a.modification_desc,
        a.authority_name, a.authority_cui,
        a.supplier_name, a.supplier_cui,
        cl.county AS authority_county
      FROM seap.announcements a
      LEFT JOIN seap.cui_location cl ON cl.cui = a.authority_cui
      WHERE a.modification_desc IS NOT NULL
        AND a.awarded_value IS NOT NULL
      ORDER BY a.awarded_value DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.title || `Anunț #${r.id}`,
      primaryHref: `/anunt/${r.id}`,
      secondary: `${r.authority_name || '?'} ${r.authority_county ? `· ${r.authority_county}` : ''}`,
      detail: r.supplier_name ? `→ ${r.supplier_name}` : undefined,
      metric: `${fmtRON(Number(r.value))} RON`,
      metricRaw: Number(r.value),
      badge: { label: 'modificat', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const captureUat: Recipe = {
  slug: 'capture-institutionala',
  title: 'UAT-uri cu HHI ridicat (capture)',
  teaser: 'UAT-uri unde puține firme concentrează majoritatea contractelor — Indicele Herfindahl-Hirschman peste 5000.',
  description: 'HHI > 2500 = piață concentrată (DOJ Antitrust). HHI > 5000 = quasi-monopol pe achizițiile UAT-ului. La nivel local nu e neapărat ilegal, dar trebuie verificat dacă concentrarea reflectă specializare reală sau "captură" de către un grup.',
  icon: '⚖',
  category: 'concentrare',
  metricLabel: 'HHI',
  whyItMatters: 'Comunele mici cu un singur furnizor pe drumuri/salubritate de ani de zile pot avea concentrare legitimă (puțini furnizori în zonă). Dar atunci când e o municipalitate medie cu HHI 5000+, e foarte probabil că furnizorul are un avantaj structural — politic sau de alianță.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        u.siruta, u.name AS uat_name, u.county,
        k.hhi_suppliers,
        k.top_supplier_share,
        k.total_value,
        k.total_contracts,
        k.distinct_suppliers
      FROM seap.uat_kpi k
      JOIN public."GisUat" u ON u.siruta = k.siruta
      WHERE k.hhi_suppliers >= 5000
        AND k.total_contracts >= 10
      ORDER BY k.hhi_suppliers DESC, k.total_value DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.uat_name,
      primaryHref: `/judet/${encodeURIComponent(r.county)}`,
      secondary: `${r.county} · ${r.distinct_suppliers} furnizori distincți`,
      detail: `Top furnizor concentrează ${fmtPct(Number(r.top_supplier_share))} din valoare`,
      metric: `HHI ${Math.round(Number(r.hhi_suppliers))}`,
      metricRaw: Number(r.hhi_suppliers),
      badge: { label: Number(r.hhi_suppliers) > 7500 ? 'monopol' : 'concentrat', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const q4Spike: Recipe = {
  slug: 'spike-sfarsit-de-an',
  title: 'UAT-uri cu spike Q4 anormal',
  teaser: 'UAT-uri care au cheltuit anormal de mult în trimestrul 4 al ultimului an — peste 1.7× media trimestrială.',
  description: 'End-of-year rush: bugetele neutilizate trebuie consumate până pe 31 decembrie sau se pierd. Asta produce o avalanșă de contracte slab planificate, atribuiri directe sub urgență, prețuri umflate. UE Single Market Scoreboard tratează rata Q4 anormală ca indicator de planificare slabă.',
  icon: '⏱',
  category: 'temporal',
  metricLabel: 'Spike ratio',
  whyItMatters: 'Un Q4 cu cheltuieli de 4× media trimestrului indică buget neutilizat care se cheltuie în 6 săptămâni. Calitatea bunurilor primite și prețurile sunt aproape întotdeauna mai proaste decât cele negociate competitiv în restul anului.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        u.siruta, u.name AS uat_name, u.county,
        k.q4_spike,
        k.total_value,
        k.total_contracts
      FROM seap.uat_kpi k
      JOIN public."GisUat" u ON u.siruta = k.siruta
      WHERE k.q4_spike >= 1.7
        AND k.total_contracts >= 10
      ORDER BY k.q4_spike DESC, k.total_value DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.uat_name,
      primaryHref: `/judet/${encodeURIComponent(r.county)}`,
      secondary: `${r.county} · ${fmtRON(Number(r.total_value))} RON anual`,
      detail: `${r.total_contracts} anunțuri totale, valoare Q4 ${Number(r.q4_spike).toFixed(1)}× media trimestru`,
      metric: `${Number(r.q4_spike).toFixed(2)}×`,
      metricRaw: Number(r.q4_spike),
      badge: { label: Number(r.q4_spike) > 3 ? 'spike extrem' : 'spike Q4', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const dependencyExtreme: Recipe = {
  slug: 'dependenta-furnizor',
  title: 'UAT-uri dependente de un singur furnizor',
  teaser: 'UAT-uri unde top furnizor concentrează peste 70% din valoarea totală a achizițiilor.',
  description: 'OCP red flag CR-1: dependența autoritate-furnizor. Peste 70% înseamnă că autoritatea practic nu mai are alternativă — pierderea acestui furnizor ar paraliza activitatea publică. Caz extrem de "captură instituțională".',
  icon: '👑',
  category: 'concentrare',
  metricLabel: '% top furnizor',
  whyItMatters: 'Când un furnizor deține peste 70% din contractele unei primării de ani de zile, alți operatori încetează să mai depună oferte (perceived futility). Concurența scade artificial chiar și pe procedurile aparent deschise.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        u.siruta, u.name AS uat_name, u.county,
        k.top_supplier_share,
        k.total_value,
        k.total_contracts
      FROM seap.uat_kpi k
      JOIN public."GisUat" u ON u.siruta = k.siruta
      WHERE k.top_supplier_share >= 0.70
        AND k.total_contracts >= 10
      ORDER BY k.top_supplier_share DESC, k.total_value DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.uat_name,
      primaryHref: `/judet/${encodeURIComponent(r.county)}`,
      secondary: `${r.county} · ${r.total_contracts} anunțuri în istoric`,
      detail: `${fmtRON(Number(r.total_value))} RON cheltuiți total`,
      metric: fmtPct(Number(r.top_supplier_share)),
      metricRaw: Number(r.top_supplier_share),
      badge: { label: 'monopol furnizor', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const reachExtinde: Recipe = {
  slug: 'firme-multe-judete',
  title: 'Firme cu prezență națională',
  teaser: 'Furnizori care au câștigat contracte în 15+ județe — operatori "naționali" pe public procurement.',
  description: 'Lista nu e neapărat de "rele băieți" — multe firme legitime operează la scară. Dar atunci când o firmă din comuna X câștigă contracte în 30 de județe, prețuri în top 5%, în categorii nelegate (ex. salubritate + IT + construcții), ar putea fi un "vehicul" partajat.',
  icon: '🌍',
  category: 'reach',
  metricLabel: 'Județe',
  whyItMatters: 'OCP red flag R048: heterogeneous supplier — entropie CPV mare combinată cu reach geografic mare e marker pentru "front company" care servește ca interfață între un grup politic și diverse autorități.',
  async fetch() {
    const result = await query<any>(`
      SELECT cui_norm, name, contracts, total_value, county_count
      FROM seap.mv_top_suppliers
      WHERE county_count >= 15
      ORDER BY county_count DESC, total_value DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || '?',
      primaryHref: `/firma/${r.cui_norm}`,
      secondary: `CUI ${r.cui_norm} · ${r.contracts} contracte`,
      detail: `${fmtRON(Number(r.total_value))} RON valoare totală`,
      metric: `${r.county_count} jud`,
      metricRaw: Number(r.county_count),
      badge: Number(r.county_count) >= 30 ? { label: 'omniprezent', tone: 'warn' } : undefined,
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const cpvDirectShare: Recipe = {
  slug: 'cpv-directe-mari',
  title: 'Categorii cu cea mai mare cotă pe achiziție directă',
  teaser: 'Categorii CPV unde peste 30% din valoare merge prin achiziție directă, ordonate după valoarea totală.',
  description: 'Anumite categorii (servicii juridice, consultanță, IT specializat) au prag mai înalt pentru achiziție directă — legitim. Dar când 60-70% din "construcții" sau "salubritate" merg pe directe, e clar că pragul e fragmentat sistematic.',
  icon: '📦',
  category: 'cpv',
  metricLabel: '% direct',
  whyItMatters: 'EU SMSC: rata achiziției directe la nivel național ar trebui sub 5%. RO median ~25%, dar pe anumite categorii (consultanță, IT primării) trece de 60%. Lista de mai jos identifică sectoarele cu pattern sistematic de evitare a competiției.',
  async fetch() {
    const result = await query<any>(`
      SELECT cpv_division, cpv_name, emoji, contracts, total_value, direct_value, direct_pct
      FROM seap.mv_top_cpv_divisions
      WHERE total_value >= 100000000 AND direct_pct >= 0.30
      ORDER BY direct_pct DESC, total_value DESC
      LIMIT 30
    `);
    return result.rows.map((r) => ({
      primary: `${r.emoji || '📄'} ${r.cpv_name || `CPV ${r.cpv_division}`}`,
      primaryHref: `/categoria/${r.cpv_division}`,
      secondary: `Categorie CPV ${r.cpv_division}`,
      detail: `${r.contracts} contracte · ${fmtRON(Number(r.total_value))} RON total · ${fmtRON(Number(r.direct_value))} direct`,
      metric: fmtPct(Number(r.direct_pct)),
      metricRaw: Number(r.direct_pct),
      badge: { label: 'direct dominant', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const crossCounty: Recipe = {
  slug: 'cross-county-outflow',
  title: 'Județe cu outflow extern mare',
  teaser: 'Județe unde majoritatea valorii contractelor pleacă la furnizori din afara județului.',
  description: 'Cross-county outflow măsoară % din valoarea anunțurilor unei autorități județene care merge la furnizori non-locali. Ratio mare ≠ neapărat rău (orașe mari atrag furnizori din toată țara). Ratio mare în zone rurale poate semnala absența economiei locale sau preferințe politice.',
  icon: '🔄',
  category: 'reach',
  metricLabel: '% outflow',
  whyItMatters: 'OCP indicator GEO-3: pentru CPV-uri "strict locale" (salubritate, întreținere drumuri locale, mese școlare), un outflow >50% e suspect — fie nu există furnizori locali (lipsă de dezvoltare), fie există dar pierd consistent. Banii publici locali ar trebui să stimuleze economia locală.',
  async fetch() {
    const result = await query<any>(`
      WITH county_flows AS (
        SELECT
          acl.county AS authority_county,
          SUM(a.awarded_value) AS total_value,
          SUM(a.awarded_value) FILTER (
            WHERE acl.county IS NOT NULL
              AND scl.county IS NOT NULL
              AND acl.county != scl.county
          ) AS outflow_value
        FROM seap.announcements a
        LEFT JOIN seap.cui_location acl ON acl.cui = a.authority_cui
        LEFT JOIN seap.cui_location scl ON scl.cui = regexp_replace(upper(a.supplier_cui), '(^RO)|\\s+', '', 'g')
        WHERE a.awarded_value IS NOT NULL
          AND acl.county IS NOT NULL
          AND scl.county IS NOT NULL
        GROUP BY acl.county
      )
      SELECT
        authority_county AS county,
        total_value,
        outflow_value,
        CASE WHEN total_value > 0 THEN outflow_value / total_value ELSE 0 END AS outflow_pct
      FROM county_flows
      WHERE total_value >= 100000000
      ORDER BY outflow_pct DESC
      LIMIT 30
    `);
    return result.rows.map((r) => ({
      primary: r.county,
      primaryHref: `/judet/${encodeURIComponent(r.county)}`,
      secondary: `${fmtRON(Number(r.total_value))} RON valoare totală`,
      detail: `${fmtRON(Number(r.outflow_value))} RON merg la furnizori din alte județe`,
      metric: fmtPct(Number(r.outflow_pct)),
      metricRaw: Number(r.outflow_pct),
      badge: Number(r.outflow_pct) > 0.7 ? { label: 'outflow extrem', tone: 'warn' } : undefined,
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

// ─────────────────────────────────────────────────────────────────────────────

const thresholdBunching: Recipe = {
  slug: 'bunching-sub-270k',
  title: 'Achiziții directe clusterizate sub pragul legal',
  teaser: 'Contracte directe între 200K și 270K lei — sub pragul de 270.120 lei (2026 produse) — semnal pentru fragmentare deliberată.',
  description: 'Pragul achiziție directă pentru produse/servicii este 270.120 lei (2026). Contracte fragmentate sistematic la 250-269K, în special pe același furnizor în același an, indică evitarea procedurii competitive.',
  icon: '✂️',
  category: 'directa',
  metricLabel: 'Valoare RON',
  whyItMatters: 'IACRC red flag "manipulation of procurement thresholds" — clasic pe achiziții publice. Trebuie analizat per autoritate și per furnizor: dacă același furnizor primește 5 contracte de 265K în decurs de 3 luni, scopul e clar.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        a.id, a.title, a.publication_date,
        a.awarded_value::numeric AS value,
        a.authority_name, a.authority_cui,
        a.supplier_name, a.supplier_cui,
        cl.county AS authority_county
      FROM seap.announcements a
      LEFT JOIN seap.cui_location cl ON cl.cui = a.authority_cui
      WHERE a.type = 'da'
        AND a.awarded_value BETWEEN 200000 AND 270000
        AND a.currency = 'RON'
      ORDER BY a.awarded_value DESC, a.publication_date DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.title || `Anunț #${r.id}`,
      primaryHref: `/anunt/${r.id}`,
      secondary: `${r.authority_name || '?'}${r.authority_county ? ` · ${r.authority_county}` : ''}`,
      detail: r.supplier_name ? `→ ${r.supplier_name}` : undefined,
      metric: `${fmtRON(Number(r.value))} RON`,
      metricRaw: Number(r.value),
      badge: { label: 'sub prag direct', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const repeatedWinner: Recipe = {
  slug: 'perechi-recurente',
  title: 'Perechi autoritate↔furnizor cu valoare cumulată mare',
  teaser: 'Top 50 perechi autoritate-furnizor după valoare totală — relațiile recurente cele mai mari.',
  description: 'Nu e neapărat suspect — multe relații pe termen lung sunt legitime (acord-cadru, expertiză specializată). Dar atunci când o pereche atinge sume foarte mari fără reînnoire competitivă, sau când un furnizor mic devine "preferatul" unei autorități mari, merită verificare.',
  icon: '🔁',
  category: 'concentrare',
  metricLabel: 'Valoare cumulată',
  whyItMatters: 'OCP CR-1 + R006 (repeated winner). În OECD framework: perechile autoritate-furnizor cu >40% relație continuă pe 5+ ani semnalează "captură instituțională" — pierderea unei astfel de relații paralizează ambele părți.',
  async fetch() {
    const result = await query<any>(`
      SELECT authority_cui, authority_name, supplier_cui_norm, supplier_name,
             county, contracts, total_value, first_year, last_year
      FROM seap.mv_recurrent_pairs
      ORDER BY total_value DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: `${r.authority_name} ↔ ${r.supplier_name}`,
      primaryHref: `/autoritate/${r.authority_cui}`,
      secondary: `${r.county || ''} · ${r.contracts} contracte (${r.first_year}–${r.last_year})`,
      detail: `Furnizor CUI ${r.supplier_cui_norm}`,
      metric: `${fmtRON(Number(r.total_value))} RON`,
      metricRaw: Number(r.total_value),
      badge: r.contracts >= 20 ? { label: 'recurență mare', tone: 'warn' } : undefined,
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const savingsSuspect: Recipe = {
  slug: 'economii-suspecte',
  title: 'Diferențe extreme estimat vs atribuit',
  teaser: 'Contracte unde valoarea atribuită diferă cu >40% de cea estimată — fie estimat umflat, fie ofertă de tip "lowball".',
  description: 'Saving ratio normal: 5-15%. Sub 2% = competiție slabă (preț pre-aranjat). Peste 30% = ofertă neserios de mică (lowball, urmată ulterior de modificări) sau valoare estimată extrem umflată (corupție în planificare).',
  icon: '📉',
  category: 'modificate',
  metricLabel: 'Δ%',
  whyItMatters: 'OCP R005 (suspicious savings). Validat ca indicator robust de DigiWhist CRI. Lowballs urmate de modificări reprezintă schema #1 în RO — câștigi cu -45% sub estimat, apoi ridici prin amendamente.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        a.id, a.title, a.publication_date,
        a.estimated_value::numeric AS estimated,
        a.awarded_value::numeric AS awarded,
        ((a.estimated_value - a.awarded_value) / a.estimated_value)::numeric AS savings_ratio,
        a.authority_name, a.authority_cui,
        a.supplier_name
      FROM seap.announcements a
      WHERE a.estimated_value IS NOT NULL
        AND a.awarded_value IS NOT NULL
        AND a.estimated_value > 50000
        AND ABS((a.estimated_value - a.awarded_value) / a.estimated_value) > 0.40
        AND a.estimated_value > a.awarded_value
      ORDER BY savings_ratio DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.title || `Anunț #${r.id}`,
      primaryHref: `/anunt/${r.id}`,
      secondary: `${r.authority_name || '?'} → ${r.supplier_name || '?'}`,
      detail: `Estimat ${fmtRON(Number(r.estimated))} RON · Atribuit ${fmtRON(Number(r.awarded))} RON`,
      metric: `−${(Number(r.savings_ratio) * 100).toFixed(0)}%`,
      metricRaw: Number(r.savings_ratio),
      badge: Number(r.savings_ratio) > 0.6 ? { label: 'lowball', tone: 'risk' } : { label: 'estimat umflat?', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const overprice: Recipe = {
  slug: 'preturi-peste-mediana-cpv',
  title: 'Contracte peste mediana categoriei CPV',
  teaser: 'Anunțuri unde valoarea atribuită depășește dublul medianei pentru aceeași categorie CPV.',
  description: 'Comparație vs mediana per CPV-division calculată din toate contractele cu valoare. Contractele 2× peste mediană pot reflecta complexitate reală sau preț umflat — necesită verificare manuală a specificațiilor tehnice.',
  icon: '📈',
  category: 'cpv',
  metricLabel: '× mediană',
  whyItMatters: 'OCP R058 inversă: heavily-priced bid. Util mai ales pe CPV-uri standardizate (servicii curățenie, papetărie, combustibil) unde dispersia naturală e mică. Unit price 2× pe materii fungibile = aproape sigur supraîncărcare.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        a.id, a.title, a.publication_date,
        a.awarded_value::numeric AS awarded,
        m.median_value::numeric AS median,
        (a.awarded_value / m.median_value)::numeric AS ratio,
        a.cpv_division,
        c.name_ro AS cpv_name,
        c.emoji,
        a.authority_name,
        a.supplier_name
      FROM seap.announcements a
      JOIN seap.mv_cpv_median_value m ON m.cpv_division = a.cpv_division
      LEFT JOIN seap.cpv_codes c ON c.code = a.cpv_division
      WHERE a.awarded_value IS NOT NULL
        AND a.awarded_value > 100000
        AND m.median_value > 10000
        AND a.awarded_value / m.median_value > 2
      ORDER BY ratio DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.title || `Anunț #${r.id}`,
      primaryHref: `/anunt/${r.id}`,
      secondary: `${r.emoji || '📄'} ${r.cpv_name || `CPV ${r.cpv_division}`}`,
      detail: `${r.authority_name} → ${r.supplier_name} · ${fmtRON(Number(r.awarded))} (mediană ${fmtRON(Number(r.median))})`,
      metric: `${Number(r.ratio).toFixed(1)}×`,
      metricRaw: Number(r.ratio),
      badge: Number(r.ratio) > 5 ? { label: 'extrem', tone: 'risk' } : { label: 'peste mediană', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const cpvSingleSupplier: Recipe = {
  slug: 'firme-specializate-extrem',
  title: 'Firme cu o singură categorie CPV (>90%)',
  teaser: 'Furnizori care au peste 90% din valoare pe o singură categorie — specializare extremă sau "front" pentru o nișă.',
  description: 'Specializarea legitimă există (medicamente, IT, construcții). Dar furnizori cu cifră mare pe O SINGURĂ categorie + concentrare cumpărători (top buyer >50%) e candidat pentru "front company".',
  icon: '🎯',
  category: 'cpv',
  metricLabel: 'Cifră CPV principal',
  whyItMatters: 'Combinație R048 invers (heterogen) + dependență. Specializarea legitimă vine cu mulți cumpărători diverși. Specializarea + dependență = vehicul.',
  async fetch() {
    const result = await query<any>(`
      SELECT cui, name, cpv_division, cpv_name, emoji, contracts, cpv_value, total, share
      FROM seap.mv_supplier_cpv_share
      WHERE share > 0.90
      ORDER BY total DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || '?',
      primaryHref: `/firma/${r.cui}`,
      secondary: `${r.emoji || '📄'} ${r.cpv_name || `CPV ${r.cpv_division}`}`,
      detail: `${r.contracts} contracte · ${(Number(r.share) * 100).toFixed(0)}% din valoare pe această categorie`,
      metric: `${fmtRON(Number(r.cpv_value))} RON`,
      metricRaw: Number(r.cpv_value),
      badge: { label: 'mono-categorie', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const tedForeign: Recipe = {
  slug: 'furnizori-straini-ted',
  title: 'Furnizori străini cu contracte mari în RO',
  teaser: 'Top furnizori non-RO câștigători pe TED RO, după valoare totală — măsură a deschiderii pieței.',
  description: 'Procentul scăzut de câștigători non-RO pe TED indică piață închisă (efect de descurajare a participării internaționale). Pentru contracte mari de infrastructură, prezența furnizorilor europeni e benefică (concurență, transfer de competență).',
  icon: '🌐',
  category: 'reach',
  metricLabel: 'Valoare RON',
  whyItMatters: 'EU SMSC: cross-border supplier rate. RO are unul dintre cele mai mici procente UE. Lista identifică firmele care REUȘESC totuși să câștige — partener pentru advocacy "deschiderii pieței".',
  async fetch() {
    const result = await query<any>(`
      SELECT
        regexp_replace(upper(a.supplier_cui), '(^RO)|\\s+', '', 'g') AS cui,
        MIN(a.supplier_name) AS name,
        MIN(a.supplier_address) AS address,
        COUNT(*)::int AS contracts,
        COALESCE(SUM(a.awarded_value), 0)::numeric AS total_value,
        COUNT(DISTINCT a.authority_cui)::int AS distinct_authorities
      FROM seap.announcements a
      WHERE a.source LIKE 'ted%'
        AND a.supplier_cui IS NOT NULL
        AND a.supplier_cui !~ '^(RO|RO\\s)?[0-9]+$'  -- non-RO format CUI
        AND a.awarded_value IS NOT NULL
      GROUP BY 1
      HAVING COUNT(*) >= 1
      ORDER BY total_value DESC
      LIMIT 30
    `);
    return result.rows.map((r) => ({
      primary: r.name || '?',
      secondary: `ID ${r.cui}${r.address ? ` · ${r.address.slice(0, 60)}` : ''}`,
      detail: `${r.contracts} contracte cu ${r.distinct_authorities} autorități RO`,
      metric: `${fmtRON(Number(r.total_value))} RON`,
      metricRaw: Number(r.total_value),
      badge: { label: 'TED străin', tone: 'ok' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const cpvTotal: Recipe = {
  slug: 'top-categorii-bani',
  title: 'Pe ce merg banii — top categorii CPV',
  teaser: 'Top 30 categorii CPV după valoarea cumulată a contractelor naționale.',
  description: 'Clasamentul "unde se duc banii". Construcții drumuri, sănătate, IT, salubritate — câte miliarde pe fiecare. Util pentru a înțelege priorități bugetare reale (vs cele declarate).',
  icon: '💰',
  category: 'cpv',
  metricLabel: 'Valoare totală',
  whyItMatters: 'Compari cu strategiile naționale. Dacă investiția în "educație" e a 12-a prioritate dar discursul politic spune "prioritar", e dezalignment. Util ca infografic pentru jurnaliști care comentează bugete.',
  async fetch() {
    const result = await query<any>(`
      SELECT cpv_division, cpv_name, emoji, contracts, total_value,
             distinct_authorities, distinct_suppliers
      FROM seap.mv_top_cpv_divisions
      ORDER BY total_value DESC NULLS LAST
      LIMIT 30
    `);
    return result.rows.map((r) => ({
      primary: `${r.emoji || '📄'} ${r.cpv_name || `CPV ${r.cpv_division}`}`,
      primaryHref: `/categoria/${r.cpv_division}`,
      secondary: `Categorie CPV ${r.cpv_division}`,
      detail: `${r.contracts} contracte · ${r.distinct_authorities} autorități · ${r.distinct_suppliers} furnizori`,
      metric: `${fmtRON(Number(r.total_value))} RON`,
      metricRaw: Number(r.total_value),
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const topAuthoritiesByValue: Recipe = {
  slug: 'top-autoritati-cheltuitori',
  title: 'Top autorități contractante după valoare',
  teaser: 'Cele mai mari 50 autorități contractante naționale — cine cheltuie cei mai mulți bani publici.',
  description: 'Clasament absolut. Dominate de ministere mari, CNAIR, CNAS, spitale județene mari. Fiecare merită o pagină de profil cu KPI și flow lines pe hartă.',
  icon: '🏛️',
  category: 'concentrare',
  metricLabel: 'Valoare totală',
  whyItMatters: 'Clasament de bază pentru prioritizare audit. Resursele Curții de Conturi sunt limitate — top 50 autorități concentrează majoritatea valorii naționale, deci primează la audit.',
  async fetch() {
    const result = await query<any>(`
      SELECT authority_cui, name, county, authority_type, contracts, total_value, distinct_suppliers
      FROM seap.mv_top_authorities
      ORDER BY total_value DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || '?',
      primaryHref: `/autoritate/${r.authority_cui}`,
      secondary: `${r.authority_type || ''}${r.county ? ` · ${r.county}` : ''}`,
      detail: `${r.contracts} contracte · ${r.distinct_suppliers} furnizori distincți`,
      metric: `${fmtRON(Number(r.total_value))} RON`,
      metricRaw: Number(r.total_value),
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const topFirmsByValue: Recipe = {
  slug: 'top-firme-castigatoare',
  title: 'Top firme câștigătoare la achiziții publice',
  teaser: 'Cele mai mari 50 firme după valoare cumulată din contracte publice.',
  description: 'Lista include atât giganti legitimi (multinaționale construcții, distribuitori medicamente) cât și firme RO mai mici cu volume disproportionate. Combinat cu numărul de cumpărători + acoperirea geografică, separi cele două.',
  icon: '🏢',
  category: 'reach',
  metricLabel: 'Valoare totală',
  whyItMatters: 'Reflectă concentrarea pieței la nivel național. Top 10 furnizori dețin ~15-20% din valoarea totală — concentrare moderată. Pentru categorii specifice (medicamente, drumuri) concentrarea e mult mai mare.',
  async fetch() {
    const result = await query<any>(`
      SELECT cui_norm AS cui, name, county, contracts, total_value, distinct_buyers
      FROM seap.mv_top_suppliers
      ORDER BY total_value DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || '?',
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.county ? ` · ${r.county}` : ''}`,
      detail: `${r.contracts} contracte · ${r.distinct_buyers} autorități cumpărătoare`,
      metric: `${fmtRON(Number(r.total_value))} RON`,
      metricRaw: Number(r.total_value),
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const longestContracts: Recipe = {
  slug: 'cele-mai-mari-contracte',
  title: 'Cele mai mari contracte individuale',
  teaser: 'Top 50 contracte după valoare individuală — cele mai mari atribuiri publice istorice.',
  description: 'Lista absolută. Construcții autostrăzi, achiziții echipament militar, infrastructură sanitară. Toate trebuie să fi trecut prin proceduri UE TED (>27 mil RON pe lucrări).',
  icon: '💎',
  category: 'cpv',
  metricLabel: 'Valoare contract',
  whyItMatters: 'Marile contracte sunt sub atenție publică intensă — și totuși apar regulat probleme (schimbări sponsorizate, modificări post-atribuire, cesiuni către sub-contractori legati de partid). Lista permite urmărirea longitudinală.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        a.id, a.title, a.publication_date,
        a.awarded_value::numeric AS value,
        a.authority_name, a.authority_cui,
        a.supplier_name,
        a.cpv_division,
        c.name_ro AS cpv_name,
        c.emoji
      FROM seap.announcements a
      LEFT JOIN seap.cpv_codes c ON c.code = a.cpv_division
      WHERE a.awarded_value IS NOT NULL
        AND a.awarded_value > 0
      ORDER BY a.awarded_value DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.title || `Anunț #${r.id}`,
      primaryHref: `/anunt/${r.id}`,
      secondary: `${r.emoji || '📄'} ${r.cpv_name || ''}`,
      detail: `${r.authority_name || '?'} → ${r.supplier_name || '?'}`,
      metric: `${fmtRON(Number(r.value))} RON`,
      metricRaw: Number(r.value),
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const negotiatedNoPub: Recipe = {
  slug: 'negociere-fara-publicare',
  title: 'Negocieri fără publicare prealabilă mari',
  teaser: 'Top 50 contracte atribuite prin "negociere fără publicare" — procedura cea mai puțin transparentă.',
  description: 'Negocierea fără publicare e legală în cazuri excepționale (urgență, exclusivitate, drepturi) dar abuzată sistemic. Lista identifică cele mai mari astfel de contracte — fiecare merită justificare publică.',
  icon: '🔒',
  category: 'directa',
  metricLabel: 'Valoare RON',
  whyItMatters: 'OCP framework R002 + EU SMSC. Procedura cea mai vulnerabilă la captură. Conform Legii 98/2016 art. 104, urgența + exclusivitatea sunt singurele justificări — în practică se invocă pentru orice.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        a.id, a.title, a.publication_date,
        a.awarded_value::numeric AS value,
        a.authority_name, a.authority_cui,
        a.supplier_name,
        a.cpv_division,
        c.name_ro AS cpv_name,
        c.emoji
      FROM seap.announcements a
      LEFT JOIN seap.cpv_codes c ON c.code = a.cpv_division
      WHERE a.procedure_type ILIKE '%negociere%fara%'
        AND a.awarded_value IS NOT NULL
      ORDER BY a.awarded_value DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.title || `Anunț #${r.id}`,
      primaryHref: `/anunt/${r.id}`,
      secondary: `${r.emoji || '📄'} ${r.cpv_name || ''}`,
      detail: `${r.authority_name || '?'} → ${r.supplier_name || '?'}`,
      metric: `${fmtRON(Number(r.value))} RON`,
      metricRaw: Number(r.value),
      badge: { label: 'fără publicare', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const lowSavings: Recipe = {
  slug: 'savings-aproape-zero',
  title: 'Contracte cu savings sub 2% (competiție slabă)',
  teaser: 'Contracte unde valoarea atribuită e foarte aproape de cea estimată — concurență slabă sau preț pre-negociat.',
  description: 'Saving ratio sub 2% pe estimări mari (>1M RON) e neobișnuit. În piețe competitive, ofertele câștigătoare scad cu 5-15% sub estimat. Sub 2% indică ofertă unică sau cooperare ascunsă.',
  icon: '🪙',
  category: 'concentrare',
  metricLabel: 'Δ vs estimat',
  whyItMatters: 'OCP R024 (price close to winning bid). Combinat cu single-bidder, e indicator puternic de cartel sau preț pre-aranjat. EU SMSC: rata savings <5% pe contracte mari = piață necompetitivă.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        a.id, a.title, a.publication_date,
        a.estimated_value::numeric AS estimated,
        a.awarded_value::numeric AS awarded,
        ((a.estimated_value - a.awarded_value) / a.estimated_value)::numeric AS savings_ratio,
        a.authority_name, a.authority_cui,
        a.supplier_name
      FROM seap.announcements a
      WHERE a.estimated_value > 1000000  -- > 1M RON only
        AND a.awarded_value IS NOT NULL
        AND a.awarded_value <= a.estimated_value
        AND ((a.estimated_value - a.awarded_value) / a.estimated_value) BETWEEN 0 AND 0.02
      ORDER BY a.awarded_value DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.title || `Anunț #${r.id}`,
      primaryHref: `/anunt/${r.id}`,
      secondary: `${r.authority_name || '?'} → ${r.supplier_name || '?'}`,
      detail: `Estimat ${fmtRON(Number(r.estimated))} · Atribuit ${fmtRON(Number(r.awarded))}`,
      metric: `−${(Number(r.savings_ratio) * 100).toFixed(2)}%`,
      metricRaw: Number(r.savings_ratio),
      badge: { label: 'aproape egal cu estimatul', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────
// Recipes powered by the firms registry (ONRC + financials).
// ─────────────────────────────────────────────────────────────────────────────

const topFirmsByCifraAfaceri: Recipe = {
  slug: 'top-firme-cifra-afaceri',
  title: 'Top firme România după cifra de afaceri',
  teaser: 'Topul național al companiilor cu cele mai mari cifre de afaceri publicate la Min. Finanțelor — context de referință pentru cine câștigă achiziții publice.',
  description: 'Datele provin din situațiile financiare anuale depuse la Min. Finanțelor (cea mai recentă raportare per firmă). Util pentru a vedea unde se situează firmele active în SEAP relativ la economia reală.',
  icon: '🏆',
  category: 'firme',
  metricLabel: 'Cifră afaceri',
  whyItMatters: 'Permite verificarea de bază a credibilității unui ofertant: o firmă care câștigă contracte de zeci de milioane RON ar trebui să aibă cifră de afaceri pe-aproape sau cel puțin nu neglijabilă. Diferențe mari indică ofertant nou (verificabil) sau structură de "firmă fantomă".',
  async fetch() {
    const result = await query<any>(`
      SELECT
        e.cui, e.name, e.adr_judet,
        f.cifra_afaceri::numeric AS cifra_afaceri,
        f.profit_net::numeric AS profit_net,
        f.numar_salariati,
        f.year
      FROM firms.mv_financials_latest f
      JOIN firms.entities e ON e.cui = f.cui
      WHERE f.cifra_afaceri > 0
        AND e.name IS NOT NULL
      ORDER BY f.cifra_afaceri DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `${r.numar_salariati ? `${fmtRON(Number(r.numar_salariati))} salariați` : 'salariați necunoscuți'} · raportare ${r.year}${r.profit_net ? ` · profit net ${fmtRON(Number(r.profit_net))} RON` : ''}`,
      metric: `${fmtRON(Number(r.cifra_afaceri))} RON`,
      metricRaw: Number(r.cifra_afaceri),
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const oneEmployeeBigContracts: Recipe = {
  slug: 'firme-1-salariat-contracte-mari',
  title: 'Firme cu 0–1 salariați și contracte publice mari',
  teaser: 'Companii care raportează cel mult un singur salariat la Min. Finanțelor, dar au câștigat contracte publice de peste 1 mil RON.',
  description: 'O firmă fără angajați nu poate executa, în general, lucrări sau servicii la scară. Lista de mai jos identifică cele mai mari astfel de cazuri — proxy pentru "firmă-front" sau intermediere ascunsă.',
  icon: '🪤',
  category: 'firme',
  metricLabel: 'Valoare contracte',
  whyItMatters: 'Pattern clasic în studiile de captură: firma "câștigă" pe hârtie, apoi subcontractează totul. Combinat cu administrator comun cu firma reală executantă, devine indicator de simulație de competiție. OCP indicator R032 (capacity gap) acoperă și acest pattern.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        e.cui, e.name, e.adr_judet,
        s.contracts, s.total_value::numeric AS total_value, s.distinct_buyers,
        f.numar_salariati, f.year AS fin_year,
        f.cifra_afaceri::numeric AS cifra_afaceri
      FROM seap.mv_top_suppliers s
      JOIN firms.entities e ON e.cui = s.cui_norm
      JOIN firms.mv_financials_latest f ON f.cui = e.cui
      WHERE f.numar_salariati IS NOT NULL
        AND f.numar_salariati BETWEEN 0 AND 1
        AND s.total_value > 1000000
      ORDER BY s.total_value DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `${r.numar_salariati || 0} salariați (${r.fin_year}) · ${r.contracts} anunțuri · ${r.distinct_buyers} cumpărători${r.cifra_afaceri ? ` · CA ${fmtRON(Number(r.cifra_afaceri))}` : ''}`,
      metric: `${fmtRON(Number(r.total_value))} RON`,
      metricRaw: Number(r.total_value),
      badge: { label: 'capacitate suspectă', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const lossWinners: Recipe = {
  slug: 'firme-cu-pierderi-mari-castigatoare',
  title: 'Firme cu pierderi mari care câștigă contracte mari',
  teaser: 'Companii care au raportat pierdere netă peste 1 mil RON în ultima raportare, dar au luat contracte publice de peste 5 mil RON.',
  description: 'O firmă care pierde bani an de an dar câștigă constant contracte publice merită verificată. Poate fi vorba de afacere proastă cu noroc la licitații, dar mai des de fluxuri financiare ciudate (dezinvestire deliberată, exitare cu profit ascuns la mamă).',
  icon: '📉',
  category: 'firme',
  metricLabel: 'Valoare contracte',
  whyItMatters: 'Indicator de "zombie company" care subzistă din contracte publice. Dacă firma e radiată ulterior sau intră în insolvență, pierderea pentru bugetul public e dublă: contractul plătit + lucrarea neexecutată.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        e.cui, e.name, e.adr_judet,
        s.contracts, s.total_value::numeric AS total_value, s.distinct_buyers,
        f.pierdere_neta::numeric AS pierdere_neta,
        f.cifra_afaceri::numeric AS cifra_afaceri,
        f.year AS fin_year
      FROM seap.mv_top_suppliers s
      JOIN firms.entities e ON e.cui = s.cui_norm
      JOIN firms.mv_financials_latest f ON f.cui = e.cui
      WHERE f.pierdere_neta > 1000000
        AND s.total_value > 5000000
      ORDER BY f.pierdere_neta DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `Pierdere netă ${fmtRON(Number(r.pierdere_neta))} RON (${r.fin_year}) · ${r.contracts} anunțuri · CA ${fmtRON(Number(r.cifra_afaceri || 0))}`,
      metric: `${fmtRON(Number(r.total_value))} RON`,
      metricRaw: Number(r.total_value),
      badge: { label: `pierdere ${r.fin_year}`, tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const newFirmsBigContracts: Recipe = {
  slug: 'firme-noi-cu-contracte-mari',
  title: 'Firme noi (sub 24 luni) cu contracte publice mari',
  teaser: 'Companii înmatriculate în ultimele 24 de luni care au câștigat deja contracte publice substanțiale — căutate pentru pattern-uri de "firmă lansată cu contract gata pregătit".',
  description: 'O firmă creată recent care câștigă rapid contracte mari poate fi: (a) fondatori experimentați cu reputație în piață, sau (b) vehicul lansat special pentru a primi un contract pre-aranjat. Distincția se face prin verificarea administratorilor și a istoricului lor.',
  icon: '🌱',
  category: 'firme',
  metricLabel: 'Valoare contracte',
  whyItMatters: 'Pattern documentat în literatura academică: "instant winners" — firme tinere fără istoric demonstrat care iau contracte care în mod normal cer experiență anterioară. Prag de avertisment: contracte > 500K RON la firmă cu < 24 luni vechime.',
  async fetch() {
    const result = await query<any>(`
      SELECT
        e.cui, e.name, e.adr_judet,
        to_char(e.data_inmatriculare, 'YYYY-MM-DD') AS data_inmatriculare,
        EXTRACT(EPOCH FROM (NOW() - e.data_inmatriculare))::int / 2592000 AS months_since_reg,
        s.contracts, s.total_value::numeric AS total_value, s.distinct_buyers
      FROM firms.entities e
      JOIN seap.mv_top_suppliers s ON s.cui_norm = e.cui
      WHERE e.data_inmatriculare IS NOT NULL
        AND e.data_inmatriculare > NOW() - INTERVAL '24 months'
        AND s.total_value > 500000
      ORDER BY s.total_value DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `Înmatriculată acum ${r.months_since_reg} luni (${r.data_inmatriculare}) · ${r.contracts} anunțuri · ${r.distinct_buyers} cumpărători`,
      metric: `${fmtRON(Number(r.total_value))} RON`,
      metricRaw: Number(r.total_value),
      badge: { label: `firmă nouă · ${r.months_since_reg}L`, tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const euFundsAndSeap: Recipe = {
  slug: 'firme-cu-fonduri-eu-si-seap',
  title: 'Firme care primesc fonduri EU ȘI câștigă contracte de la stat',
  teaser: 'Top firme care apar simultan ca beneficiari privați de fonduri europene și ca furnizori la autorități publice prin SEAP.',
  description: 'Aceste firme alimentează ambele țevi de bani publici: directe prin licitațiile SEAP (autorități contractante) și indirecte prin proiectele lor finanțate cu fonduri UE (POIM/POR/PNRR/AFIR), unde tot ele cumpără. Combinat, dă o privire mai realistă peste cât absoarbe firma din bani publici.',
  icon: '🇪🇺',
  category: 'firme',
  metricLabel: 'Total RON (EU + SEAP)',
  whyItMatters: 'Datele EU funds beneficiar privați nu intră în SEAP (cumpărătorul e privat, nu autoritate publică), deci aceste firme erau invizibile pe partea EU. Joinul devoalează "double-dippers": firme cu acces la ambele țevi. Util pentru analiză concurenței și verificare overlap.',
  async fetch() {
    const result = await query<any>(`
      WITH ben_amount AS (
        SELECT b.cui,
               COUNT(*) AS anunturi_eu,
               SUM(l.buget_lei) AS buget_eu
        FROM fonduri.beneficiar_anunt b
        LEFT JOIN fonduri.beneficiar_anunt_lot l ON l.anunt_id = b.id
        WHERE b.cui IS NOT NULL
        GROUP BY b.cui
      ),
      seap_amount AS (
        SELECT supplier_cui AS cui,
               COUNT(*) AS contracte_seap,
               SUM(awarded_value) AS valoare_seap,
               COUNT(DISTINCT authority_cui) AS autoritati
        FROM seap.announcements
        WHERE supplier_cui IS NOT NULL AND awarded_value > 0
        GROUP BY supplier_cui
      )
      SELECT b.cui,
             e.name,
             e.adr_judet,
             b.anunturi_eu,
             b.buget_eu::numeric AS buget_eu,
             s.contracte_seap,
             s.valoare_seap::numeric AS valoare_seap,
             s.autoritati,
             (COALESCE(b.buget_eu, 0) + COALESCE(s.valoare_seap, 0))::numeric AS total_combined
      FROM ben_amount b
      JOIN seap_amount s ON s.cui = b.cui
      JOIN firms.entities e ON e.cui = b.cui
      WHERE COALESCE(b.buget_eu, 0) + COALESCE(s.valoare_seap, 0) > 0
      ORDER BY total_combined DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `EU: ${r.anunturi_eu} anunțuri / ${fmtRON(Number(r.buget_eu || 0))} RON · SEAP: ${r.contracte_seap} contracte / ${fmtRON(Number(r.valoare_seap || 0))} RON la ${r.autoritati} autorități`,
      metric: `${fmtRON(Number(r.total_combined))} RON`,
      metricRaw: Number(r.total_combined),
      badge: { label: 'EU + SEAP', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const newFirmsEuFunds: Recipe = {
  slug: 'firme-noi-cu-fonduri-eu-mari',
  title: 'Firme noi (sub 24 luni) cu fonduri europene mari',
  teaser: 'Companii înmatriculate recent care apar deja ca beneficiari privați de fonduri UE pe proceduri cu buget consistent.',
  description: 'O firmă tânără care primește fonduri europene mari poate fi (a) start-up legitim cu fondatori experimentați, sau (b) vehicul ridicat în jurul unui proiect EU pre-aranjat. Pattern-ul "firmă-pentru-proiect" merită investigat când buget per anunț e ridicat și firma nu are alte surse de venit demonstrate.',
  icon: '🌱',
  category: 'firme',
  metricLabel: 'Buget loturi EU (RON)',
  whyItMatters: 'Indicator dual: testează atât (1) maturitatea pieței EU funding (vârsta medie a beneficiarilor scade) cât și (2) fenomenul "vehicul-pentru-proiect" frecvent în POIM/POR/PRSM. Pragul ales: înmatriculare în ultimele 24L + buget loturi cumulat >500K RON.',
  async fetch() {
    const result = await query<any>(`
      WITH ben_amount AS (
        SELECT b.cui,
               COUNT(*) AS anunturi_eu,
               SUM(l.buget_lei) AS buget_eu
        FROM fonduri.beneficiar_anunt b
        LEFT JOIN fonduri.beneficiar_anunt_lot l ON l.anunt_id = b.id
        WHERE b.cui IS NOT NULL
        GROUP BY b.cui
      )
      SELECT
        e.cui, e.name, e.adr_judet,
        to_char(e.data_inmatriculare, 'YYYY-MM-DD') AS data_inmatriculare,
        EXTRACT(EPOCH FROM (NOW() - e.data_inmatriculare))::int / 2592000 AS months_since_reg,
        b.anunturi_eu, b.buget_eu::numeric AS buget_eu
      FROM ben_amount b
      JOIN firms.entities e ON e.cui = b.cui
      WHERE e.data_inmatriculare IS NOT NULL
        AND e.data_inmatriculare > NOW() - INTERVAL '24 months'
        AND b.buget_eu > 500000
      ORDER BY b.buget_eu DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `Înmatriculată acum ${r.months_since_reg} luni (${r.data_inmatriculare}) · ${r.anunturi_eu} anunțuri EU`,
      metric: `${fmtRON(Number(r.buget_eu))} RON`,
      metricRaw: Number(r.buget_eu),
      badge: { label: `firmă nouă · ${r.months_since_reg}L`, tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const euOnlyNoSeap: Recipe = {
  slug: 'beneficiari-eu-fara-seap',
  title: 'Beneficiari privați de fonduri UE care NU vând la stat',
  teaser: 'Firme cu fonduri europene în volum, dar care nu apar deloc ca furnizori în SEAP — economie privată finanțată exclusiv prin pipe-ul UE.',
  description: 'Inversul recipei "EU + SEAP": aceste firme primesc fonduri europene (POIM/POR/PNRR/PRSM/AFIR) pentru proiecte proprii, dar nu participă la licitațiile de la stat. Util pentru a măsura economia privată reală finanțată din UE — fără a fi confondată cu stat-ul.',
  icon: '🇪🇺',
  category: 'firme',
  metricLabel: 'Buget loturi EU (RON)',
  whyItMatters: 'Counter-narativă utilă: nu toți beneficiarii UE sunt "double-dippers". Mulți construiesc fabrici / digitalizează / extind capacități cu bani UE fără să vândă la primării. Această retetă arată cine sunt aceștia.',
  async fetch() {
    const result = await query<any>(`
      WITH ben_amount AS (
        SELECT b.cui,
               COUNT(*) AS anunturi_eu,
               SUM(l.buget_lei) AS buget_eu
        FROM fonduri.beneficiar_anunt b
        LEFT JOIN fonduri.beneficiar_anunt_lot l ON l.anunt_id = b.id
        WHERE b.cui IS NOT NULL
        GROUP BY b.cui
      ),
      seap_suppliers AS (
        SELECT DISTINCT supplier_cui FROM seap.announcements
        WHERE supplier_cui IS NOT NULL AND awarded_value > 0
      )
      SELECT b.cui, e.name, e.adr_judet,
             b.anunturi_eu, b.buget_eu::numeric AS buget_eu
      FROM ben_amount b
      JOIN firms.entities e ON e.cui = b.cui
      LEFT JOIN seap_suppliers s ON s.supplier_cui = b.cui
      WHERE s.supplier_cui IS NULL
        AND b.buget_eu > 100000
      ORDER BY b.buget_eu DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `${r.anunturi_eu} anunțuri EU · zero contracte SEAP`,
      metric: `${fmtRON(Number(r.buget_eu))} RON`,
      metricRaw: Number(r.buget_eu),
      badge: { label: 'EU-only', tone: 'ok' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const afirAndSeap: Recipe = {
  slug: 'firme-cu-afir-si-seap',
  title: 'Firme care primesc plăți AFIR ȘI câștigă contracte SEAP',
  teaser: 'Beneficiari FEADR (subvenții agricole / dezvoltare rurală) care vând și ele la stat prin SEAP.',
  description: 'Aceste firme alimentează două surse paralele de bani publici: plăți AFIR (FEADR) și contracte SEAP de la autorități publice. Combinația e neobișnuită — fermierul/firma care își vinde și produsele/serviciile la stat. Util ca semnal de "agribusiness cu acces multiplu".',
  icon: '🌾',
  category: 'firme',
  metricLabel: 'Total RON (AFIR + SEAP)',
  whyItMatters: 'Pattern rar — doar 352 firme apar în ambele surse. Multe sunt cooperative agricole sau processori care vând și inputuri/servicii la primării. Util pentru a vedea cine sunt "polii agribusiness" cu multiplu pipe public.',
  async fetch() {
    const result = await query<any>(`
      WITH afir_amount AS (
        SELECT cui,
               COUNT(*) AS plati_afir,
               SUM(COALESCE(ue_total, feadr_total, fega_total, op_amount, 0)) AS afir_lei
        FROM fonduri.afir_plati
        WHERE cui IS NOT NULL
        GROUP BY cui
      ),
      seap_amount AS (
        SELECT supplier_cui AS cui,
               COUNT(*) AS contracte_seap,
               SUM(awarded_value) AS seap_lei,
               COUNT(DISTINCT authority_cui) AS autoritati
        FROM seap.announcements
        WHERE supplier_cui IS NOT NULL AND awarded_value > 0
        GROUP BY supplier_cui
      )
      SELECT a.cui, e.name, e.adr_judet,
             a.plati_afir, a.afir_lei::numeric AS afir_lei,
             s.contracte_seap, s.seap_lei::numeric AS seap_lei, s.autoritati,
             (COALESCE(a.afir_lei, 0) + COALESCE(s.seap_lei, 0))::numeric AS total_combined
      FROM afir_amount a
      JOIN seap_amount s ON s.cui = a.cui
      JOIN firms.entities e ON e.cui = a.cui
      ORDER BY total_combined DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `AFIR: ${r.plati_afir} plăți / ${fmtRON(Number(r.afir_lei || 0))} RON · SEAP: ${r.contracte_seap} contracte / ${fmtRON(Number(r.seap_lei || 0))} RON la ${r.autoritati} autorități`,
      metric: `${fmtRON(Number(r.total_combined))} RON`,
      metricRaw: Number(r.total_combined),
      badge: { label: 'AFIR + SEAP', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const triplePipe: Recipe = {
  slug: 'firme-triplu-pipe-public',
  title: 'Firme cu TRIPLU pipe public (EU privat + SEAP + AFIR)',
  teaser: 'Cele 13 firme din toată România care apar simultan în toate trei sursele de bani publici: fonduri EU privați, contracte SEAP de la stat, și plăți AFIR.',
  description: 'Cazuri ultra-rare: o firmă care în același timp (a) primește fonduri europene ca beneficiar privat al unui proiect cu fonduri UE, (b) câștigă licitații publice prin SEAP de la autorități, ȘI (c) primește plăți AFIR pentru activități agricole / dezvoltare rurală. Acest triplu acces nu apare la întâmplare.',
  icon: '🔱',
  category: 'firme',
  metricLabel: 'Total RON (toate 3 surse)',
  whyItMatters: 'Cele mai expuse 13 firme din ecosistemul public-privat românesc. Fiecare merită investigație individuală: cum a obținut acces la toate trei pipe-urile? Pattern rar = semnal puternic.',
  async fetch() {
    const result = await query<any>(`
      WITH ben_amount AS (
        SELECT b.cui, COUNT(*) AS anunturi_eu, SUM(l.buget_lei) AS buget_eu
        FROM fonduri.beneficiar_anunt b
        LEFT JOIN fonduri.beneficiar_anunt_lot l ON l.anunt_id = b.id
        WHERE b.cui IS NOT NULL GROUP BY b.cui
      ),
      seap_amount AS (
        SELECT supplier_cui AS cui, COUNT(*) AS contracte, SUM(awarded_value) AS valoare
        FROM seap.announcements
        WHERE supplier_cui IS NOT NULL AND awarded_value > 0
        GROUP BY supplier_cui
      ),
      afir_amount AS (
        SELECT cui, COUNT(*) AS plati,
               SUM(COALESCE(ue_total, feadr_total, fega_total, op_amount, 0)) AS afir_lei
        FROM fonduri.afir_plati WHERE cui IS NOT NULL GROUP BY cui
      )
      SELECT b.cui, e.name, e.adr_judet,
             b.anunturi_eu, b.buget_eu::numeric AS buget_eu,
             s.contracte, s.valoare::numeric AS seap_lei,
             a.plati, a.afir_lei::numeric AS afir_lei,
             (COALESCE(b.buget_eu,0) + COALESCE(s.valoare,0) + COALESCE(a.afir_lei,0))::numeric AS total_combined
      FROM ben_amount b
      JOIN seap_amount s ON s.cui = b.cui
      JOIN afir_amount a ON a.cui = b.cui
      JOIN firms.entities e ON e.cui = b.cui
      ORDER BY total_combined DESC NULLS LAST
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `EU privat: ${r.anunturi_eu} / ${fmtRON(Number(r.buget_eu || 0))} · SEAP: ${r.contracte} / ${fmtRON(Number(r.seap_lei || 0))} · AFIR: ${r.plati} / ${fmtRON(Number(r.afir_lei || 0))} RON`,
      metric: `${fmtRON(Number(r.total_combined))} RON`,
      metricRaw: Number(r.total_combined),
      badge: { label: '🔱 triplu pipe', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const benAndAfir: Recipe = {
  slug: 'firme-cu-fonduri-eu-si-afir',
  title: 'Firme cu fonduri EU privați ȘI plăți AFIR',
  teaser: 'Beneficiari de proiecte EU finanțate care primesc și plăți AFIR pentru activități agricole.',
  description: 'Aceste 134 firme combină fonduri europene de proiect (POIM/POR/PRSM/PRC/etc.) cu plăți AFIR pe FEADR. Adesea sunt firme agro-industriale care derulează atât investiții non-agricole cât și activitate agricolă subvenționată.',
  icon: '🌾',
  category: 'firme',
  metricLabel: 'Total RON (EU + AFIR)',
  whyItMatters: 'Combinația neobișnuită semnalează firme cu portofoliu hibrid agri/non-agri. Util pentru a identifica concentrarea finanțărilor pe câțiva jucători diversificați vs distribuție democratică.',
  async fetch() {
    const result = await query<any>(`
      WITH ben_amount AS (
        SELECT b.cui, COUNT(*) AS anunturi_eu, SUM(l.buget_lei) AS buget_eu
        FROM fonduri.beneficiar_anunt b
        LEFT JOIN fonduri.beneficiar_anunt_lot l ON l.anunt_id = b.id
        WHERE b.cui IS NOT NULL GROUP BY b.cui
      ),
      afir_amount AS (
        SELECT cui, COUNT(*) AS plati,
               SUM(COALESCE(ue_total, feadr_total, fega_total, op_amount, 0)) AS afir_lei
        FROM fonduri.afir_plati WHERE cui IS NOT NULL GROUP BY cui
      )
      SELECT b.cui, e.name, e.adr_judet,
             b.anunturi_eu, b.buget_eu::numeric AS buget_eu,
             a.plati, a.afir_lei::numeric AS afir_lei,
             (COALESCE(b.buget_eu, 0) + COALESCE(a.afir_lei, 0))::numeric AS total_combined
      FROM ben_amount b
      JOIN afir_amount a ON a.cui = b.cui
      JOIN firms.entities e ON e.cui = b.cui
      ORDER BY total_combined DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `EU privat: ${r.anunturi_eu} anunțuri / ${fmtRON(Number(r.buget_eu || 0))} RON · AFIR: ${r.plati} plăți / ${fmtRON(Number(r.afir_lei || 0))} RON`,
      metric: `${fmtRON(Number(r.total_combined))} RON`,
      metricRaw: Number(r.total_combined),
      badge: { label: 'EU + AFIR', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const afirOnlyTopAbsorbers: Recipe = {
  slug: 'top-absorbanti-afir',
  title: 'Top absorbanți AFIR (fără SEAP, fără fonduri EU privați)',
  teaser: 'Cei mai mari beneficiari de plăți FEADR care nu apar în alte registre publice — economia agricolă subvenționată.',
  description: 'Spre deosebire de "double-dippers", aceștia sunt fermieri / cooperative / firme agro care primesc EXCLUSIV plăți AFIR. Counter-narrativă la concentrarea urbană: aici se vede absorbția fondurilor în zonele rurale Moldova / Oltenia / Banat.',
  icon: '🌾',
  category: 'firme',
  metricLabel: 'Plăți AFIR (RON)',
  whyItMatters: 'Distribuția pe județe a top absorbanților AFIR-only spune mult despre cine își dezvoltă agricultura prin fonduri europene. Identifică polii rurali de eficiență.',
  async fetch() {
    const result = await query<any>(`
      WITH afir_amount AS (
        SELECT cui, COUNT(*) AS plati,
               SUM(COALESCE(ue_total, feadr_total, fega_total, op_amount, 0)) AS afir_lei
        FROM fonduri.afir_plati WHERE cui IS NOT NULL GROUP BY cui
      ),
      seap_suppliers AS (
        SELECT DISTINCT supplier_cui FROM seap.announcements
        WHERE supplier_cui IS NOT NULL AND awarded_value > 0
      ),
      ben_cuis AS (
        SELECT DISTINCT cui FROM fonduri.beneficiar_anunt WHERE cui IS NOT NULL
      )
      SELECT a.cui, e.name, e.adr_judet, a.plati, a.afir_lei::numeric AS afir_lei
      FROM afir_amount a
      JOIN firms.entities e ON e.cui = a.cui
      LEFT JOIN seap_suppliers s ON s.supplier_cui = a.cui
      LEFT JOIN ben_cuis b ON b.cui = a.cui
      WHERE s.supplier_cui IS NULL
        AND b.cui IS NULL
        AND a.afir_lei > 100000
      ORDER BY a.afir_lei DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `${r.plati} plăți AFIR · zero contracte SEAP · zero fonduri EU privați`,
      metric: `${fmtRON(Number(r.afir_lei))} RON`,
      metricRaw: Number(r.afir_lei),
      badge: { label: 'AFIR-only', tone: 'ok' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const judeteEuAbsorbtie: Recipe = {
  slug: 'judete-top-absorbtie-publica',
  title: 'Județe după absorbție totală fonduri publice (EU + SEAP + AFIR)',
  teaser: 'Top județe după suma totală RON absorbită din toate cele 3 surse de bani publici, agregată per județ de sediu firmă.',
  description: 'Combinarea celor trei pipe-uri (fonduri EU privați + contracte SEAP + plăți AFIR) la nivel județean dezvăluie geografia reală a banilor publici. Bucureștiul concentrează SEAP, județele agricole concentrează AFIR, județele cu industrie sau servicii captează fonduri EU. Distribuția dezvăluie cine primește dispropornat.',
  icon: '🗺️',
  category: 'reach',
  metricLabel: 'Total RON absorbit',
  whyItMatters: 'Comparativă județe-între-județe pentru transparență geografică. Identifică județele "sub-finanțate" (raportat la PIB sau populație) și pe cele "supra-finanțate".',
  async fetch() {
    const result = await query<any>(`
      WITH ben AS (
        SELECT e.adr_judet AS judet, SUM(l.buget_lei) AS lei
        FROM fonduri.beneficiar_anunt b
        LEFT JOIN fonduri.beneficiar_anunt_lot l ON l.anunt_id = b.id
        JOIN firms.entities e ON e.cui = b.cui
        WHERE b.cui IS NOT NULL AND e.adr_judet IS NOT NULL
        GROUP BY e.adr_judet
      ),
      seap AS (
        SELECT e.adr_judet AS judet, SUM(a.awarded_value) AS lei
        FROM seap.announcements a
        JOIN firms.entities e ON e.cui = regexp_replace(a.supplier_cui, '^RO\\s*', '', 'i')
        WHERE a.supplier_cui IS NOT NULL AND a.awarded_value > 0 AND e.adr_judet IS NOT NULL
        GROUP BY e.adr_judet
      ),
      afir AS (
        SELECT e.adr_judet AS judet,
               SUM(COALESCE(ap.ue_total, ap.feadr_total, ap.fega_total, ap.op_amount, 0)) AS lei
        FROM fonduri.afir_plati ap
        JOIN firms.entities e ON e.cui = ap.cui
        WHERE ap.cui IS NOT NULL AND e.adr_judet IS NOT NULL
        GROUP BY e.adr_judet
      )
      SELECT
        upper(translate(coalesce(b.judet, s.judet, a.judet), 'şŞţŢ', 'sStT')) AS judet,
        COALESCE(b.lei, 0)::numeric AS ben_lei,
        COALESCE(s.lei, 0)::numeric AS seap_lei,
        COALESCE(a.lei, 0)::numeric AS afir_lei,
        (COALESCE(b.lei, 0) + COALESCE(s.lei, 0) + COALESCE(a.lei, 0))::numeric AS total_lei
      FROM ben b
      FULL OUTER JOIN seap s ON s.judet = b.judet
      FULL OUTER JOIN afir a ON a.judet = COALESCE(b.judet, s.judet)
      ORDER BY total_lei DESC NULLS LAST
      LIMIT 42
    `);
    return result.rows.map((r) => ({
      primary: r.judet,
      primaryHref: `/judet/${encodeURIComponent(r.judet)}`,
      secondary: `EU: ${fmtRON(Number(r.ben_lei))} · SEAP: ${fmtRON(Number(r.seap_lei))} · AFIR: ${fmtRON(Number(r.afir_lei))}`,
      detail: '',
      metric: `${fmtRON(Number(r.total_lei))} RON`,
      metricRaw: Number(r.total_lei),
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

// "Triple pipe" extended — firme cu ajutoare de stat RegAS care câștigă și SEAP.
// Sursa: regas.ajutoare (Consiliul Concurenței) × seap.announcements.
// Indicator: firme care primesc bani direcți (ajutor de stat — fonduri
// nerambursabile, scutiri, garanții) ȘI vând la stat prin SEAP — flux dublu.
const regasAndSeap: Recipe = {
  slug: 'firme-cu-ajutor-de-stat-si-seap',
  title: 'Firme cu ajutoare de stat care câștigă și contracte SEAP',
  teaser: 'Firme listate în Registrul Ajutoarelor de Stat (Consiliul Concurenței) care apar simultan ca furnizori câștigători pe SEAP — flux dublu de bani publici.',
  description: 'O firmă poate primi bani de la stat în două moduri esențiale: (1) ajutor de stat direct — fonduri nerambursabile, garanții, scutiri fiscale (înregistrate în RegAS), sau (2) contracte de achiziție publică — câștigate prin SEAP. Combinarea celor două surse arată firmele cu acces concomitent la ambele țevi. Util pentru detectarea concentrării și a "campionilor naționali" subvenționați.',
  icon: '🏛️',
  category: 'firme',
  metricLabel: 'Total RON (ajutor + SEAP)',
  whyItMatters: 'RegAS conține 132K+ ajutoare de stat acordate firmelor RO 2014-2026 (POIM/PNRR/HG schemes/etc.). Multe dintre ele nu apar în SEAP (cumpărătorul e privat). Joinul RegAS × SEAP evidențiază firmele care primesc atât subvenții cât și contracte — adesea aceleași firme care apar și în "EU + SEAP". Cross-check util pentru integritate.',
  async fetch() {
    const result = await query<any>(`
      WITH regas_amount AS (
        SELECT cui,
               COUNT(*) AS nr_ajutoare,
               SUM(ajutor_acordat_subcategorie) AS total_ajutor,
               COUNT(DISTINCT id_masura) AS nr_masuri,
               COUNT(DISTINCT finantator) AS nr_finantatori
        FROM regas.ajutoare
        WHERE cui IS NOT NULL
        GROUP BY cui
      ),
      seap_amount AS (
        SELECT supplier_cui AS cui,
               COUNT(*) AS contracte_seap,
               SUM(awarded_value) AS valoare_seap,
               COUNT(DISTINCT authority_cui) AS autoritati
        FROM seap.announcements
        WHERE supplier_cui IS NOT NULL AND awarded_value > 0
        GROUP BY supplier_cui
      )
      SELECT r.cui,
             e.name,
             e.adr_judet,
             r.nr_ajutoare,
             r.total_ajutor::numeric AS total_ajutor,
             r.nr_masuri,
             r.nr_finantatori,
             s.contracte_seap,
             s.valoare_seap::numeric AS valoare_seap,
             s.autoritati,
             (COALESCE(r.total_ajutor, 0) + COALESCE(s.valoare_seap, 0))::numeric AS total_combined
      FROM regas_amount r
      JOIN seap_amount s ON s.cui = r.cui
      JOIN firms.entities e ON e.cui = r.cui
      WHERE COALESCE(r.total_ajutor, 0) + COALESCE(s.valoare_seap, 0) > 0
      ORDER BY total_combined DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `Ajutor stat: ${r.nr_ajutoare} ajutoare / ${fmtRON(Number(r.total_ajutor || 0))} RON la ${r.nr_finantatori} finanțatori · SEAP: ${r.contracte_seap} contracte / ${fmtRON(Number(r.valoare_seap || 0))} RON la ${r.autoritati} autorități`,
      metric: `${fmtRON(Number(r.total_combined))} RON`,
      metricRaw: Number(r.total_combined),
      badge: { label: 'Ajutor + SEAP', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────
// ANI declarații de avere și interese — flagship cross-source feature.
// Schema applied (sql/030_ani_schema.sql), scraper skeleton in
// services/seap-scraper/src/scrape-ani-declarations.ts. Until full ingest
// completes (~15 zile efort, vezi services/seap-scraper/ANI-PLAN.md), the
// recipe registers a stable slug + meta and returns 0 rows. The /retete page
// then shows it greyed out with an explanatory teaser — keeps URL stable for
// SEO and external links.
const politicianFirmaFurnizorStat: Recipe = {
  slug: 'politician-cu-firma-furnizor-stat',
  title: 'Politicieni cu firme furnizoare la stat',
  teaser:
    'Top politicieni / înalți funcționari ale căror firme declarate la ANI au câștigat contracte SEAP. Vine în curând (în lucru ingestul declarațiilor ANI 2008→).',
  description:
    'Cross-referință între declarațiile de avere/interese de la ANI (Legea 176/2010) și contractele câștigate prin SEAP. Identifică politicienii ale căror firme — declarate ca participații sau funcții deținute — apar simultan ca furnizori la autorități publice. NU înseamnă că totul e ilegal; înseamnă că merită verificare publică.',
  icon: '🏛️',
  category: 'politicieni',
  metricLabel: 'Total contracte SEAP firmă (RON)',
  whyItMatters:
    'Conflict de interese real (un demnitar votează / aprobă / contractează cu o firmă proprie) e una din cele mai grave forme de corupție. Datele există de 17 ani (1.3M+ declarații PDF la ANI), dar nu sunt cross-referențiate cu sistemul SEAP automat. Acest joinul devoalează exact pattern-ul ascuns. Disclaimer: nu toate situațiile sunt ilegale — există cadre legale (administrator delegat, blind trust) care permit afaceri în paralel cu funcția publică. Folosește lista ca punct de plecare pentru investigație, nu ca verdict.',
  async fetch() {
    // Placeholder — schema-only deployment. ani.shareholdings.firm_cui populated
    // în Stage 4 (entity resolution), contractele atunci joinabile prin
    // firms.entities.cui = seap.announcements.supplier_cui.
    //
    // Final query (când avem date):
    //   SELECT o.display_name, o.primary_function, o.primary_judet,
    //          e.name AS firm_name, e.cui,
    //          SUM(s.awarded_value) AS total_seap,
    //          COUNT(DISTINCT s.id) AS n_contracts
    //   FROM ani.officials o
    //   JOIN ani.declaratii d ON d.official_id = o.id
    //   JOIN ani.shareholdings sh ON sh.declaration_id = d.id
    //   JOIN firms.entities e ON e.cui = sh.firm_cui
    //   JOIN seap.announcements s ON s.supplier_cui = e.cui
    //   WHERE sh.firm_cui IS NOT NULL AND s.awarded_value > 0
    //   GROUP BY o.id, e.cui
    //   ORDER BY total_seap DESC NULLS LAST
    //   LIMIT 50;
    //
    // Pentru moment, returnam empty — UI page handles the empty state.
    return [];
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const quadraPipe: Recipe = {
  slug: 'firme-quadra-pipe-public',
  title: 'Firme cu QUADRA pipe public (EU privat + SEAP + AFIR + ajutor de stat)',
  teaser: 'Cele 10 firme din toată România care primesc bani publici prin TOATE cele patru țevi: fonduri europene private, contracte SEAP, plăți AFIR și ajutoare de stat (RegAS).',
  description: 'Combinație ultra-rară de patru surse de finanțare publică: (a) fonduri EU ca beneficiar privat de proiect, (b) contracte de la stat prin SEAP, (c) plăți agricole AFIR/FEADR, (d) ajutoare de stat declarate la Consiliul Concurenței. Cu 6,502 firme RegAS∩SEAP, 2,057 BEN∩SEAP, 352 AFIR∩SEAP, intersecția celor patru rămâne o anomalie: doar 10 firme. Fiecare merită screening individual.',
  icon: '🔱',
  category: 'red-flags',
  metricLabel: 'Total RON (toate 4 surse)',
  whyItMatters: 'Cele mai expuse 10 firme din ecosistemul public-privat românesc. Pattern QUADRA = rar = semnal puternic de capture multiplu sau diversificare extremă a accesului la pipe-uri publice.',
  async fetch() {
    const result = await query<any>(`
      WITH ben AS (
        SELECT b.cui, COUNT(*) AS anunturi_eu, SUM(l.buget_lei)::numeric AS buget_eu
        FROM fonduri.beneficiar_anunt b
        LEFT JOIN fonduri.beneficiar_anunt_lot l ON l.anunt_id = b.id
        WHERE b.cui IS NOT NULL GROUP BY b.cui
      ),
      seap AS (
        SELECT supplier_cui AS cui, COUNT(*) AS contracte, SUM(awarded_value)::numeric AS valoare
        FROM seap.announcements
        WHERE supplier_cui IS NOT NULL AND awarded_value > 0
        GROUP BY supplier_cui
      ),
      afir AS (
        SELECT cui, COUNT(*) AS plati,
               SUM(COALESCE(ue_total, feadr_total, fega_total, op_amount, 0))::numeric AS afir_lei
        FROM fonduri.afir_plati WHERE cui IS NOT NULL GROUP BY cui
      ),
      regas AS (
        SELECT cui, COUNT(*) AS nr_ajutoare,
               SUM(ajutor_acordat_subcategorie)::numeric AS regas_lei
        FROM regas.ajutoare WHERE cui IS NOT NULL GROUP BY cui
      )
      SELECT b.cui, e.name, e.adr_judet,
             b.anunturi_eu, b.buget_eu,
             s.contracte, s.valoare AS seap_lei,
             a.plati, a.afir_lei,
             r.nr_ajutoare, r.regas_lei,
             (COALESCE(b.buget_eu,0) + COALESCE(s.valoare,0) + COALESCE(a.afir_lei,0) + COALESCE(r.regas_lei,0))::numeric AS total_combined
      FROM ben b
      JOIN seap s ON s.cui = b.cui
      JOIN afir a ON a.cui = b.cui
      JOIN regas r ON r.cui = b.cui
      JOIN firms.entities e ON e.cui = b.cui
      ORDER BY total_combined DESC NULLS LAST
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `EU: ${fmtRON(Number(r.buget_eu || 0))} · SEAP: ${fmtRON(Number(r.seap_lei || 0))} · AFIR: ${fmtRON(Number(r.afir_lei || 0))} · RegAS: ${fmtRON(Number(r.regas_lei || 0))} RON`,
      metric: `${fmtRON(Number(r.total_combined))} RON`,
      metricRaw: Number(r.total_combined),
      badge: { label: '🔱 QUADRA pipe', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const firmeDatorniceCuContracteSeap: Recipe = {
  slug: 'firme-datornice-cu-contracte-seap',
  title: 'Firme datornice ANAF care au câștigat contracte SEAP',
  teaser: 'Companii care apăreau pe lista publică ANAF a datornicilor și au luat contracte publice IMEDIAT după publicare.',
  description: 'Conform Legii 98/2016 art. 165, ofertanții cu obligații restante exigibile la bugetul general consolidat sunt EXCLUȘI de la procedurile publice. Această rețetă încruciem snapshot ANAF datornici (Q1 2016) cu contractele SEAP semnate ulterior — devoalând firme care au luat bani de la stat în timp ce datorau bani la stat.',
  icon: '🚨',
  category: 'red-flags',
  metricLabel: 'Contracte SEAP post-debt (RON)',
  whyItMatters: 'Datornicul + contract public = încălcare clară a Legii 98/2016 art. 165. Mulți sunt SOE (state-owned enterprises) — datorii intra-stat, legitimitate parțială — dar firmele private listate aici sunt anomalii. Pe Q1 2016 snapshot: 1,561 firme datornice × 5.83 mld RON contracte post-publicare.',
  async fetch() {
    const result = await query<any>(`
      WITH agg AS (
        SELECT
          d.cui,
          d.name,
          MIN(d.publication_date) AS pub_date,
          MIN(d.period_label) AS period_label,
          MAX(d.debt_total) AS debt_total,
          MAX(d.debtor_category) AS debtor_category,
          COUNT(DISTINCT a.id) AS contracte,
          SUM(a.awarded_value)::numeric AS contracte_lei,
          MAX(a.publication_date::date) AS ultim_contract
        FROM anaf.datornici d
        JOIN seap.announcements a
          ON a.supplier_cui = d.cui
         AND a.publication_date::date > d.publication_date
        WHERE a.awarded_value IS NOT NULL AND a.awarded_value > 0
        GROUP BY d.cui, d.name
        HAVING SUM(a.awarded_value) > 100000
      )
      SELECT agg.*, e.adr_judet AS judet
      FROM agg LEFT JOIN firms.entities e ON e.cui = agg.cui
      ORDER BY contracte_lei DESC NULLS LAST
      LIMIT 100
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.judet ? ` · ${r.judet}` : ''} · ${r.period_label || 'T1 2016'}`,
      detail: `Datorie ${fmtRON(Number(r.debt_total) || 0)} RON (${r.debtor_category}) · ${r.contracte} contracte · ultim ${r.ultim_contract || '?'}`,
      metric: `${fmtRON(Number(r.contracte_lei))} RON`,
      metricRaw: Number(r.contracte_lei),
      badge: { label: '🚨 datornic + contract', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const donatoriPjCareAuCastigatSeap: Recipe = {
  slug: 'donatori-care-au-castigat-seap',
  title: 'Donatori la partide care au câștigat contracte SEAP',
  teaser: 'Firme care au donat bani unui partid și — coincidență sau nu — apar ca furnizori publici prin SEAP.',
  description: 'Donator (CUI) → partid → sumă, cross-referențiat cu seap.announcements pe supplier_cui. Un firm care donează semnificativ și câștigă contracte publice mari în aceeași perioadă e pattern-ul "money-to-power revolving door". Banii donați sunt privați, banii câștigați sunt publici — dar relația temporală merită investigată.',
  icon: '🗳️',
  category: 'red-flags',
  metricLabel: 'Contracte SEAP (RON)',
  whyItMatters: 'Legea 334/2006 nu interzice donațiile electorale + contracte SEAP simultan. Dar pattern-ul agregat (Orange→UDMR donații 1.55M + 305M contracte SEAP) e indicator de capture politică. Aceste firme merită screening jurnalist + investigație ANI pentru conflict de interese.',
  async fetch() {
    const result = await query<any>(`
      WITH don AS (
        SELECT donator_cui AS cui,
               MIN(donator_nume) AS donator,
               COUNT(*) AS nr_donatii,
               SUM(suma_lei)::numeric AS total_donatii,
               array_agg(DISTINCT partid_id ORDER BY partid_id) AS partide,
               MIN(an) AS prima,
               MAX(an) AS ultima
        FROM aep.donatii_pj
        WHERE donator_cui IS NOT NULL
        GROUP BY donator_cui
      ),
      seap AS (
        SELECT supplier_cui AS cui,
               COUNT(*) AS contracte,
               SUM(awarded_value)::numeric AS contracte_lei,
               COUNT(DISTINCT authority_cui) AS autoritati
        FROM seap.announcements
        WHERE supplier_cui IS NOT NULL AND awarded_value > 0
        GROUP BY supplier_cui
      )
      SELECT d.cui, coalesce(e.name, d.donator) AS firma, e.adr_judet AS judet,
             d.nr_donatii, d.total_donatii, d.partide, d.prima, d.ultima,
             s.contracte, s.contracte_lei, s.autoritati
      FROM don d
      JOIN seap s ON s.cui = d.cui
      LEFT JOIN firms.entities e ON e.cui = d.cui
      WHERE s.contracte_lei > 100000
      ORDER BY s.contracte_lei DESC NULLS LAST
      LIMIT 100
    `);
    return result.rows.map((r) => ({
      primary: r.firma || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.judet ? ` · ${r.judet}` : ''} · partide: ${(r.partide || []).join(', ')}`,
      detail: `${r.nr_donatii} donații (${fmtRON(Number(r.total_donatii) || 0)} RON, ${r.prima}-${r.ultima}) · ${r.contracte} contracte la ${r.autoritati} autorități`,
      metric: `${fmtRON(Number(r.contracte_lei))} RON`,
      metricRaw: Number(r.contracte_lei),
      badge: { label: '🗳️ donator + furnizor', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

const topDonatoriPerPartid: Recipe = {
  slug: 'top-donatori-pe-partid',
  title: 'Top donatori PJ per partid (toți anii)',
  teaser: 'Firmele cu cele mai mari donații cumulate către partide politice românești, agregat 2006-prezent.',
  description: 'Lista clasamentului absolut al donatorilor persoane juridice (PJ) către partide. Rețeaua de finanțare politică privată din România, în volume reale. Cross-link la profil firmă pentru context (cifră afaceri, contracte SEAP, fonduri EU).',
  icon: '💰',
  category: 'firme',
  metricLabel: 'Total donații (RON)',
  whyItMatters: 'Donațiile partide-firme apar într-o sferă publică limitată (raport AEP anual, banipartide.ro). Agregat aici devine clar cine "investește" politic la nivel național. 30K+ donații PF + 3.6K PJ + 346K granular RVC ingerate.',
  async fetch() {
    const result = await query<any>(`
      WITH agg AS (
        SELECT donator_cui AS cui,
               MIN(donator_nume) AS donator,
               array_agg(DISTINCT partid_id ORDER BY partid_id) FILTER (WHERE partid_id IS NOT NULL) AS partide,
               COUNT(*) AS nr_donatii,
               SUM(suma_lei)::numeric AS total_lei,
               MIN(an) AS prima,
               MAX(an) AS ultima
        FROM aep.donatii_pj
        WHERE donator_cui IS NOT NULL
        GROUP BY donator_cui
        HAVING SUM(suma_lei) > 50000
      )
      SELECT agg.*, e.adr_judet AS judet, e.name AS firma_onrc
      FROM agg LEFT JOIN firms.entities e ON e.cui = agg.cui
      ORDER BY total_lei DESC NULLS LAST
      LIMIT 100
    `);
    return result.rows.map((r) => ({
      primary: r.firma_onrc || r.donator || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.judet ? ` · ${r.judet}` : ''} · partide: ${(r.partide || []).join(', ')}`,
      detail: `${r.nr_donatii} donații · perioada ${r.prima}-${r.ultima}`,
      metric: `${fmtRON(Number(r.total_lei))} RON`,
      metricRaw: Number(r.total_lei),
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────
// G1 — utility/regulator cross-source recipes (ANRE / ANCOM / CNSC).

const energieFaraLicenta: Recipe = {
  slug: 'energie-fara-licenta',
  title: 'Furnizori energie fără licență ANRE',
  teaser: 'Firme care au câștigat contracte SEAP pe CPV-uri de combustibili / electricitate / gaze, dar NU apar în registrele publice ANRE ca titulare de licență.',
  description: 'Conform OUG 33/2007 și Legii 123/2012, vânzarea de energie electrică, gaze naturale și anumite servicii energetice către clienți reglementați necesită licență ANRE. Această rețetă încruciem furnizorii SEAP pe CPV 09xx (combustibili, electricitate, gaze) cu registrul ANRE — firmele care apar pe SEAP fără licență validă necesită verificare. Notă: nu toate CPV-urile 09xx implică obligativitatea licenței (ex. lemn de foc, brichete) — folosește lista ca indicator inițial.',
  icon: '⚡',
  category: 'red-flags',
  metricLabel: 'Valoare contracte SEAP (RON)',
  whyItMatters: 'Vânzarea de energie fără licență ANRE este faptă sancționată de art. 93 din Legea 123/2012 (gaze) și Legea 220/2008 (electricitate). Detectarea automată via cross-source ridică un semnal — Stage 2 trebuie să elimine cazurile legitime (subcontractare prin operator licențiat, achiziții care nu intră sub incidența licenței).',
  async fetch() {
    const result = await query<any>(`
      WITH energy_seap AS (
        SELECT a.supplier_cui,
               COUNT(*) AS contracte,
               SUM(a.awarded_value)::numeric AS valoare,
               COUNT(DISTINCT a.authority_cui) AS autoritati,
               array_agg(DISTINCT substr(a.cpv_code, 1, 4)) AS cpv_prefs
        FROM seap.announcements a
        WHERE a.supplier_cui IS NOT NULL
          AND a.awarded_value > 0
          AND a.cpv_code LIKE '09%'
        GROUP BY a.supplier_cui
      )
      SELECT s.supplier_cui AS cui,
             e.name,
             e.adr_judet,
             s.contracte,
             s.valoare,
             s.autoritati,
             s.cpv_prefs
      FROM energy_seap s
      LEFT JOIN anre.mv_licente_per_cui m ON m.cui = s.supplier_cui
      JOIN firms.entities e ON e.cui = s.supplier_cui
      WHERE m.cui IS NULL
      ORDER BY s.valoare DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `${r.contracte} contracte · ${r.autoritati} autorități · CPV ${(r.cpv_prefs || []).slice(0, 5).join(', ')}`,
      metric: `${fmtRON(Number(r.valoare))} RON`,
      metricRaw: Number(r.valoare),
      badge: { label: 'fără licență ANRE', tone: 'risk' },
    }));
  },
};

const telcoFaraLicenta: Recipe = {
  slug: 'telco-fara-licenta',
  title: 'Furnizori telco fără autorizare ANCOM',
  teaser: 'Firme care au câștigat contracte SEAP pe CPV 64 (servicii de telecomunicații) dar NU apar în registrul public ANCOM al furnizorilor autorizați.',
  description: 'Conform OUG 111/2011, furnizarea de rețele și servicii de comunicații electronice necesită autorizare generală la ANCOM. Această rețetă încruciem furnizorii SEAP pe CPV 64xx (servicii de telecomunicații, internet, voce, transmisie date) cu registrul ANCOM — firmele care vând servicii telco fără autorizare necesită verificare. CPV 32xx (echipamente) nu intră în filtru, fiindcă vânzarea de hardware nu obligă la autorizare ANCOM.',
  icon: '📡',
  category: 'red-flags',
  metricLabel: 'Valoare contracte SEAP (RON)',
  whyItMatters: 'Furnizarea de servicii de comunicații electronice fără autorizare generală ANCOM este sancționată conform art. 142 OUG 111/2011. Cu 5,231 contracte SEAP pe CPV 64xx și doar 518 furnizori autorizați ANCOM, există un decalaj evident care merită mapat firmă cu firmă.',
  async fetch() {
    const result = await query<any>(`
      WITH telco_seap AS (
        SELECT a.supplier_cui,
               COUNT(*) AS contracte,
               SUM(a.awarded_value)::numeric AS valoare,
               COUNT(DISTINCT a.authority_cui) AS autoritati,
               array_agg(DISTINCT substr(a.cpv_code, 1, 4)) AS cpv_prefs
        FROM seap.announcements a
        WHERE a.supplier_cui IS NOT NULL
          AND a.awarded_value > 0
          AND a.cpv_code LIKE '64%'
        GROUP BY a.supplier_cui
      )
      SELECT s.supplier_cui AS cui,
             e.name,
             e.adr_judet,
             s.contracte,
             s.valoare,
             s.autoritati,
             s.cpv_prefs
      FROM telco_seap s
      LEFT JOIN ancom.mv_operatori_per_cui m ON m.cui = s.supplier_cui
      JOIN firms.entities e ON e.cui = s.supplier_cui
      WHERE m.cui IS NULL
      ORDER BY s.valoare DESC NULLS LAST
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `${r.contracte} contracte · ${r.autoritati} autorități · CPV ${(r.cpv_prefs || []).slice(0, 5).join(', ')}`,
      metric: `${fmtRON(Number(r.valoare))} RON`,
      metricRaw: Number(r.valoare),
      badge: { label: 'fără autorizare ANCOM', tone: 'risk' },
    }));
  },
};

const autoritatiContestate: Recipe = {
  slug: 'autoritati-contestate-cnsc',
  title: 'Autorități cu cele mai multe contestații CNSC',
  teaser: 'Top 50 autorități contractante după numărul de contestații depuse la CNSC, cu volumul total de proceduri SEAP pentru context.',
  description: 'Consiliul Național de Soluționare a Contestațiilor (CNSC) judecă contestațiile pe proceduri SEAP. Frecvența ridicată a contestațiilor împotriva unei autorități indică probleme procedurale repetate: documentații slabe, criterii părtinitoare, evaluări contestabile. Stage 2 (PDF parse) va adăuga rata de admitere — care e indicatorul-killer ("autorități cu cele mai mari șanse să piardă la CNSC"). Pe Stage 1, contestation_count e proxy-ul cel mai bun.',
  icon: '⚖️',
  category: 'firme',
  metricLabel: 'Contestații CNSC',
  whyItMatters: 'CNSC e prima linie de control independent asupra calității procedurilor publice. O autoritate cu sute de contestații e adesea una care: (a) lansează multe proceduri (volum mare, normal), (b) le scrie prost (criterii ambigue, atribuiri contestate), sau (c) favorizează vizibil ofertanți specifici. Combinând count-ul CNSC cu volumul SEAP devine clar care din cele trei e dominant.',
  async fetch() {
    const result = await query<any>(`
      SELECT m.cui,
             m.contestation_count,
             m.first_contestation_date,
             m.last_contestation_date,
             e.name,
             e.adr_judet,
             COALESCE(s.proceduri, 0) AS proceduri,
             COALESCE(s.valoare, 0)::numeric AS valoare
      FROM cnsc.mv_per_authority_cui m
      LEFT JOIN firms.entities e ON e.cui = m.cui
      LEFT JOIN (
        SELECT authority_cui,
               COUNT(*) AS proceduri,
               SUM(awarded_value)::numeric AS valoare
        FROM seap.announcements
        WHERE authority_cui IS NOT NULL
        GROUP BY authority_cui
      ) s ON s.authority_cui = m.cui
      ORDER BY m.contestation_count DESC
      LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/autoritate/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `${r.proceduri} proceduri SEAP · ${fmtRON(Number(r.valoare || 0))} RON · contestații ${r.first_contestation_date ? new Date(r.first_contestation_date).getFullYear() : '?'}–${r.last_contestation_date ? new Date(r.last_contestation_date).getFullYear() : '?'}`,
      metric: `${r.contestation_count} contestații`,
      metricRaw: Number(r.contestation_count),
      badge: { label: '⚖️ CNSC', tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────
// G2 — financial / audit cross-source recipes (ASF / AAAS / Curtea de Conturi).

const asiguratoriFurnizoriStat: Recipe = {
  slug: 'asiguratori-furnizori-stat',
  title: 'Asigurători & brokeri ASF cu cele mai multe contracte SEAP',
  teaser: 'Firme licențiate ASF (asigurători + brokeri) care apar și ca furnizori câștigători pe SEAP — cei care vând stat-ului asigurări și servicii financiare.',
  description: 'ASF supraveghează 269 entități active (61 asigurători + 788 brokeri în registrul total, dintre care 269 active). Contractele de asigurare ale autorităților publice (RCA flotă, asigurări proprietate, asigurări de viață angajați) trec aproape în întregime prin aceste firme. Joinul ASF active × SEAP arată cine sunt furnizorii de asigurare ai statului.',
  icon: '💰',
  category: 'firme',
  metricLabel: 'Total contracte SEAP (RON)',
  whyItMatters: 'Sub-piață mică (zeci de firme), volum mare (sute de milioane RON anual). Concentrarea pe un broker poate semnala captura licitațiilor de asigurări — vezi recipes pe RCA flotă vs. proprietate.',
  async fetch() {
    const result = await query<any>(`
      WITH asf_active AS (
        SELECT cui,
               array_agg(DISTINCT register_type ORDER BY register_type) AS tipuri,
               (array_agg(register_no ORDER BY register_no))[1] AS register_no
          FROM asf.entitati
         WHERE cui IS NOT NULL
           AND section_status = 'activ'
           AND register_type IN ('asigurator', 'broker')
         GROUP BY cui
      ),
      seap AS (
        SELECT supplier_cui AS cui,
               COUNT(*) AS contracte,
               SUM(awarded_value)::numeric AS total_lei,
               COUNT(DISTINCT authority_cui) AS autoritati
          FROM seap.announcements
         WHERE supplier_cui IS NOT NULL AND awarded_value > 0
         GROUP BY supplier_cui
      )
      SELECT a.cui, a.tipuri, a.register_no,
             e.name, e.adr_judet,
             s.contracte, s.total_lei, s.autoritati
        FROM asf_active a
        JOIN seap s ON s.cui = a.cui
        LEFT JOIN firms.entities e ON e.cui = a.cui
       WHERE s.total_lei > 0
       ORDER BY s.total_lei DESC NULLS LAST
       LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''} · ${r.register_no} · ${(r.tipuri || []).join('/')}`,
      detail: `${r.contracte} contracte la ${r.autoritati} autorități publice`,
      metric: `${fmtRON(Number(r.total_lei))} RON`,
      metricRaw: Number(r.total_lei),
      badge: { label: '💰 ASF + SEAP', tone: 'warn' },
    }));
  },
};

const statActionarSeap: Recipe = {
  slug: 'stat-actionar-seap',
  title: 'Firme stat-acționar care câștigă SEAP',
  teaser: 'Companii unde statul român încă deține acțiuni (portofoliu AAAS) și care câștigă contracte publice — flux circular: stat → contract → firmă unde stat este acționar.',
  description: 'AAAS administrează 12 firme active în portofoliu — companii nepivatizate complet, unde statul încă deține pachet de acțiuni (între 53.6% și 100%). Când o astfel de firmă câștigă contracte SEAP, banii publici se întorc la o firmă unde statul este acționar — circular flow legitim sau anomalie. Cazurile interesante: state share 100% (firme practice de stat) vs. 53–60% (state controlat dar privat majoritar pe acționariat).',
  icon: '🏛️',
  category: 'red-flags',
  metricLabel: 'Total contracte SEAP (RON)',
  whyItMatters: 'AAAS = "managerul rezidual" al statului în firme privatizate parțial. Lista (12 CUIs) e mică dar de înalt impact — fiecare câștig SEAP de la un AAAS company merită screening: e marketing real sau intra-stat round-tripping? În snapshot curent: 1 AAAS firma deja are contracte SEAP.',
  async fetch() {
    const result = await query<any>(`
      WITH aaas_agg AS (
        SELECT cui,
               max_state_share_pct,
               total_debt_to_state_lei,
               statusuri
          FROM aaas.mv_per_cui
      ),
      seap AS (
        SELECT supplier_cui AS cui,
               COUNT(*) AS contracte,
               SUM(awarded_value)::numeric AS total_lei,
               COUNT(DISTINCT authority_cui) AS autoritati
          FROM seap.announcements
         WHERE supplier_cui IS NOT NULL AND awarded_value > 0
         GROUP BY supplier_cui
      )
      SELECT a.cui,
             coalesce(e.name, f.name) AS firma,
             e.adr_judet AS judet,
             a.max_state_share_pct,
             a.total_debt_to_state_lei,
             a.statusuri,
             s.contracte, s.total_lei, s.autoritati
        FROM aaas_agg a
        JOIN seap s ON s.cui = a.cui
        LEFT JOIN firms.entities e ON e.cui = a.cui
        LEFT JOIN aaas.firme f    ON f.cui = a.cui
       ORDER BY s.total_lei DESC NULLS LAST
       LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.firma || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.judet ? ` · ${r.judet}` : ''} · stat ${r.max_state_share_pct != null ? Number(r.max_state_share_pct).toFixed(1) + '%' : '?'} · ${(r.statusuri || []).join(', ')}`,
      detail: `${r.contracte} contracte la ${r.autoritati} autorități${r.total_debt_to_state_lei && Number(r.total_debt_to_state_lei) > 0 ? ` · datorii la stat ${fmtRON(Number(r.total_debt_to_state_lei))} RON` : ''}`,
      metric: `${fmtRON(Number(r.total_lei))} RON`,
      metricRaw: Number(r.total_lei),
      badge: { label: '🏛️ stat→stat', tone: 'risk' },
    }));
  },
};

const autoritatiAuditedRepetitiv: Recipe = {
  slug: 'autoritati-audited-repetitiv',
  title: 'Autorități audited repetat de Curtea de Conturi',
  teaser: 'Entități publice cu cele mai multe rapoarte de audit Curtea de Conturi în ultimii 5 ani, cross-referențiat cu volumul lor de achiziții SEAP.',
  description: 'Curtea de Conturi publică ~1,133 rapoarte de audit (financiar / conformitate / performanță / follow-up). Repetabilitatea auditului pe aceeași entitate — mai ales dacă include rapoarte follow-up — e semnal că anomaliile constatate anterior n-au fost corectate. Combinăm acest signal cu volumul SEAP al autorității pentru context "cât rulează banii publici prin entitatea audited".',
  icon: '📋',
  category: 'red-flags',
  metricLabel: 'Total contracte SEAP (RON)',
  whyItMatters: 'CUI direct populat pentru 64% din rapoarte (după strip-parens UAT-pattern match). Recipe combină count-ul de audituri cu volumul SEAP al autorității → indicator pentru "câți bani publici rulează prin entitatea audited repetitiv". Stage 2 PDF parse va aduce findings_count + valoare prejudicii pentru a calcula rata de risc per RON.',
  async fetch() {
    const result = await query<any>(`
      WITH cdc_per_cui AS (
        SELECT audited_entity_cui AS cui,
               array_agg(DISTINCT audit_type) FILTER (WHERE audit_type IS NOT NULL) AS tipuri,
               COUNT(*) AS nr_rapoarte,
               array_agg(DISTINCT audit_year) FILTER (WHERE audit_year IS NOT NULL) AS ani,
               MAX(audited_entity_name) AS audited_name_sample
          FROM curteacont.rapoarte
         WHERE audited_entity_cui IS NOT NULL
           AND publication_date >= now() - interval '5 years'
         GROUP BY audited_entity_cui
        HAVING COUNT(*) >= 2
      ),
      seap AS (
        SELECT authority_cui AS cui,
               COUNT(*) AS contracte,
               SUM(COALESCE(awarded_value, estimated_value))::numeric AS total_lei
          FROM seap.announcements
         WHERE authority_cui IS NOT NULL
         GROUP BY authority_cui
      )
      SELECT c.cui,
             e.name AS entitate,
             c.audited_name_sample,
             c.tipuri,
             c.nr_rapoarte,
             c.ani,
             s.contracte,
             s.total_lei
        FROM cdc_per_cui c
        LEFT JOIN firms.entities e ON e.cui = c.cui
        LEFT JOIN seap s ON s.cui = c.cui
       ORDER BY c.nr_rapoarte DESC, s.total_lei DESC NULLS LAST
       LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.entitate || r.audited_name_sample,
      primaryHref: `/autoritate/${r.cui}`,
      secondary: `CUI ${r.cui} · ${r.nr_rapoarte} rapoarte 5 ani · ${(r.tipuri || []).join('/')}${r.ani && r.ani.length ? ' · ani audited: ' + r.ani.sort().slice(-3).join(', ') : ''}`,
      detail: r.contracte ? `${r.contracte} anunțuri SEAP ca autoritate contractantă` : 'Fără activitate SEAP detectată',
      metric: r.total_lei ? `${fmtRON(Number(r.total_lei))} RON` : '—',
      metricRaw: Number(r.total_lei || 0),
      badge: { label: `📋 ${r.nr_rapoarte}× audit`, tone: 'warn' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────
// Political-leverage via litigation. PJ donors that ALSO contest SEAP
// procedures at CNSC. Two political-economy levers used together.
const donatoriContestatori: Recipe = {
  slug: 'donatori-politici-care-contesta-la-cnsc',
  title: 'Donatori politici (PJ) care contestă la CNSC',
  teaser: '185 firme care au donat la partide politice și au folosit calea CNSC pentru a contesta proceduri SEAP. Donații + contestații = două pârghii politico-juridice combinate.',
  description: 'Donația electorală e o pârghie politică legitimă (Legea 334/2006); contestația la CNSC e o pârghie juridică legitimă (Legea 101/2016). Folosirea ambelor de aceeași firmă nu e ilegală, dar e un pattern interesant: cine donează unei părți politice și apoi atacă proceduri publice prin organe administrative independente? Recipe combină AEP donatii_pj × cnsc.mv_per_contestator_cui pe CUI.',
  icon: '🗳️',
  category: 'red-flags',
  metricLabel: 'Donat × contestații (scor combinat)',
  whyItMatters: 'Volume mare per pârghie e normal pentru firme mari. Co-prezența ambelor pârghii pe aceeași firmă e signal de strategie deliberată: cumpărări influență la nivel politic + atacuri juridice pe proceduri specifice. Cazuri extreme: SHERIFF GUARD PROTECTION cu 62 contestații vs 27K donatie (folosește CNSC ca instrument principal, donația e simbolică).',
  async fetch() {
    const result = await query<any>(`
      WITH aep_agg AS (
        SELECT donator_cui AS cui,
               SUM(suma_lei)::numeric AS total_donat,
               array_agg(DISTINCT partid_id ORDER BY partid_id) FILTER (WHERE partid_id IS NOT NULL) AS partide,
               COUNT(*) AS nr_donatii,
               MAX(an) AS ultima_an
          FROM aep.donatii_pj
         WHERE donator_cui IS NOT NULL
         GROUP BY donator_cui
      ),
      seap AS (
        SELECT supplier_cui AS cui,
               COUNT(*) AS contracte,
               SUM(awarded_value)::numeric AS valoare_seap
          FROM seap.announcements
         WHERE supplier_cui IS NOT NULL AND awarded_value > 0
         GROUP BY supplier_cui
      )
      SELECT a.cui,
             e.name, e.adr_judet,
             a.total_donat, a.partide, a.ultima_an,
             c.contestations_filed,
             c.first_contestation_date, c.last_contestation_date,
             COALESCE(s.contracte, 0) AS contracte_seap,
             COALESCE(s.valoare_seap, 0)::numeric AS valoare_seap
        FROM aep_agg a
        JOIN cnsc.mv_per_contestator_cui c ON c.cui = a.cui
        LEFT JOIN firms.entities e ON e.cui = a.cui
        LEFT JOIN seap s ON s.cui = a.cui
       ORDER BY (a.total_donat * c.contestations_filed) DESC NULLS LAST
       LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''} · partide: ${(r.partide || []).join(', ')} (ultima ${r.ultima_an})`,
      detail: `🗳️ donat ${fmtRON(Number(r.total_donat))} RON · ⚖️ ${r.contestations_filed} contestații CNSC${r.contracte_seap > 0 ? ` · 📜 ${r.contracte_seap} contracte SEAP (${fmtRON(Number(r.valoare_seap))} RON)` : ''}`,
      metric: `${fmtRON(Number(r.total_donat))} × ${r.contestations_filed}`,
      metricRaw: Number(r.total_donat) * Number(r.contestations_filed),
      badge: { label: '🗳️⚖️ donator + contestator', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────
// Critical-infrastructure operators with tax debt. ANRE-licensed energy
// operators (electricitate / gaze / servicii) appearing on ANAF datornici.
// Cross-source: regulatory license × tax obligation. 3.1 bil RON aggregate.
const energieDatornici: Recipe = {
  slug: 'energie-licentiati-anre-datornici-anaf',
  title: 'Operatori energie licențiați ANRE care datorează ANAF',
  teaser: '875 firme cu licență/atestat ANRE pentru electricitate, gaze sau servicii energetice apar pe lista publică ANAF cu obligații restante. Total agregat: 3.14 mld RON.',
  description: 'ANRE acordă licență/atestat doar firmelor care îndeplinesc criterii de capabilitate și stabilitate. ANAF publică trimestrial lista celor cu datorii. O firmă cu licență ANRE activă care datorează ANAF poate fi sub presiune financiară severă — risc pentru continuitatea serviciilor energetice către consumatori (mai ales gaze / electricitate care sunt utilitate vitală). Recipe combină anre.mv_licente_per_cui × anaf.datornici_latest.',
  icon: '🔌',
  category: 'red-flags',
  metricLabel: 'Datorie ANAF (RON)',
  whyItMatters: 'OUG 33/2007 prevede revocarea licenței când titularul devine incapabil de a-și îndeplini obligațiile. Faptul că HIDROELECTRICA (214M datorie) și ROMGAZ (18M) — ambele de stat — sunt pe listă semnalează că aplicarea legii e selectivă: cei mici sunt blocați, cei mari beneficiază de eșalonări. Combinând cu nr_licente_active (companii mari cu zeci de licențe vs cele cu 1) devine clar care sunt cazurile sistemice.',
  async fetch() {
    const result = await query<any>(`
      WITH seap AS (
        SELECT supplier_cui AS cui,
               COUNT(*) AS contracte,
               SUM(awarded_value)::numeric AS valoare_seap
          FROM seap.announcements
         WHERE supplier_cui IS NOT NULL AND awarded_value > 0
         GROUP BY supplier_cui
      )
      SELECT a.cui,
             e.name, e.adr_judet,
             a.nr_licente_total, a.nr_active, a.nr_expirate,
             a.surse,
             d.debt_total::numeric AS debt_total,
             d.period_label,
             COALESCE(s.contracte, 0) AS contracte_seap,
             COALESCE(s.valoare_seap, 0)::numeric AS valoare_seap
        FROM anre.mv_licente_per_cui a
        JOIN anaf.datornici_latest d ON d.cui = a.cui
        LEFT JOIN firms.entities e ON e.cui = a.cui
        LEFT JOIN seap s ON s.cui = a.cui
       WHERE a.nr_active > 0
       ORDER BY d.debt_total DESC NULLS LAST
       LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''} · 🔌 ${r.nr_active} licențe active (${(r.surse || []).join('/')})${r.nr_expirate > 0 ? `, ${r.nr_expirate} expirate` : ''}`,
      detail: `🚨 datornic ${r.period_label}${r.contracte_seap > 0 ? ` · 📜 ${r.contracte_seap} contracte SEAP (${fmtRON(Number(r.valoare_seap))} RON)` : ''}`,
      metric: `${fmtRON(Number(r.debt_total))} RON datorie`,
      metricRaw: Number(r.debt_total),
      badge: { label: '🚨 ANRE + datornic', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────
// Moral hazard — firme PJ care donează la partide POLITICE în timp ce
// datorează statului bani (apar pe lista ANAF datornici). Sursele sunt
// independente: AEP/banipartide + ANAF datornici. Co-prezența = pattern.
const donatoriDatornici: Recipe = {
  slug: 'donatori-politici-care-datoreaza-statului',
  title: 'Donatori politici (PJ) care datorează statului bani',
  teaser: 'Firme persoane-juridice care au donat la partide politice ȘI apar pe lista publică ANAF cu datorii. Donezi politicienilor cu bani pe care îi datorezi statului.',
  description: 'Conform Legii 334/2006, persoanele juridice pot face donații electorale. ANAF publică trimestrial lista datornicilor (Legea 207/2015 art. 162). O firmă care apare pe ambele liste e fie (a) neglijent fiscal, fie (b) folosește donația ca pârghie politică în timp ce evade impozitele. Combinăm AEP donatii_pj × ANAF datornici_latest pe CUI.',
  icon: '🚨',
  category: 'red-flags',
  metricLabel: 'Datorie ANAF (RON)',
  whyItMatters: 'Două surse de date complet independente — AEP (transparență politică) și ANAF (executări fiscale). Co-prezența ridică două întrebări: (1) cum permit autoritățile fiscale donații politice de la firme cu obligații neîndeplinite? și (2) ce influență politică buys donația? Recipe surfacing 360 firme la primul rulaj.',
  async fetch() {
    const result = await query<any>(`
      WITH aep_agg AS (
        SELECT donator_cui AS cui,
               SUM(suma_lei)::numeric AS total_donat,
               array_agg(DISTINCT partid_id ORDER BY partid_id) FILTER (WHERE partid_id IS NOT NULL) AS partide,
               COUNT(*) AS nr_donatii,
               MIN(an) AS prima_an,
               MAX(an) AS ultima_an
          FROM aep.donatii_pj
         WHERE donator_cui IS NOT NULL
         GROUP BY donator_cui
      ),
      seap_supplier AS (
        SELECT supplier_cui AS cui,
               COUNT(*) AS contracte,
               SUM(awarded_value)::numeric AS valoare_seap
          FROM seap.announcements
         WHERE supplier_cui IS NOT NULL AND awarded_value > 0
         GROUP BY supplier_cui
      )
      SELECT d.cui,
             d.period_label,
             d.debt_total::numeric AS debt_total,
             a.total_donat,
             a.partide,
             a.nr_donatii,
             a.prima_an,
             a.ultima_an,
             e.name, e.adr_judet,
             COALESCE(s.contracte, 0) AS contracte_seap,
             COALESCE(s.valoare_seap, 0)::numeric AS valoare_seap
        FROM aep_agg a
        JOIN anaf.datornici_latest d ON d.cui = a.cui
        LEFT JOIN firms.entities e ON e.cui = a.cui
        LEFT JOIN seap_supplier s ON s.cui = a.cui
       ORDER BY d.debt_total DESC NULLS LAST
       LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/firma/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''} · partide: ${(r.partide || []).join(', ')} (${r.prima_an}–${r.ultima_an})`,
      detail: `🗳️ donat ${fmtRON(Number(r.total_donat))} RON · 🚨 datornic ${r.period_label}${r.contracte_seap > 0 ? ` · 📜 ${r.contracte_seap} contracte SEAP (${fmtRON(Number(r.valoare_seap))} RON)` : ''}`,
      metric: `${fmtRON(Number(r.debt_total))} RON datorie`,
      metricRaw: Number(r.debt_total),
      badge: { label: '🚨 donator + datornic', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────
// Double red-flag — autoritatea apare ÎN AMBELE: audited de Curtea Conturi
// recent + contestată repetat la CNSC. Convergența semnalelor independente
// e mult mai forte decât oricare singur.
const dublaAlerta: Recipe = {
  slug: 'autoritati-dubla-alerta-cdc-cnsc',
  title: 'Autorități cu DUBLĂ alertă: audited Curtea Conturi + contestate CNSC',
  teaser: 'Entități publice unde două surse independente convergent: rapoarte de audit Curtea de Conturi (ultimii 5 ani) ȘI contestații la CNSC. Co-prezența semnalelor independente e indicator puternic de probleme sistemice.',
  description: 'Curtea de Conturi auditează ex-post; CNSC primește contestații ex-ante. Cele două surse au scopuri și mecanisme complet diferite. Când amândouă semnalizează aceeași autoritate, probabilitatea ca semnalul să fie zgomot scade dramatic — e structural. Recipe combină: nr_audituri ≥ 2 ÎN ULTIMII 5 ANI + nr_contestații > 0, sortate după suma celor două.',
  icon: '🚨',
  category: 'red-flags',
  metricLabel: 'Total semnale (audit + contestații)',
  whyItMatters: 'Două axe independente de control public converg pe aceeași entitate. Co-prezența nu poate fi explicată ușor prin "volume mare → multe semnale" pentru că Curtea de Conturi auditează selectiv (~1,100 rapoarte/5 ani, nu toate autoritățile) iar CNSC primește contestații care variază pe procedură. Match-ul = pattern.',
  async fetch() {
    const result = await query<any>(`
      WITH cdc AS (
        SELECT audited_entity_cui AS cui,
               COUNT(*) AS audit_count,
               array_agg(DISTINCT audit_type) FILTER (WHERE audit_type IS NOT NULL) AS audit_types
          FROM curteacont.rapoarte
         WHERE audited_entity_cui IS NOT NULL
           AND publication_date >= now() - interval '5 years'
         GROUP BY audited_entity_cui
        HAVING COUNT(*) >= 2
      ),
      cnsc AS (
        SELECT cui, contestation_count
          FROM cnsc.mv_per_authority_cui
         WHERE contestation_count >= 3
      ),
      seap AS (
        SELECT authority_cui AS cui,
               COUNT(*) AS proceduri,
               SUM(COALESCE(awarded_value, estimated_value))::numeric AS valoare
          FROM seap.announcements
         WHERE authority_cui IS NOT NULL
         GROUP BY authority_cui
      )
      SELECT a.cui,
             e.name, e.adr_judet,
             a.audit_count, a.audit_types,
             c.contestation_count,
             (a.audit_count + c.contestation_count) AS total_signals,
             COALESCE(s.proceduri, 0) AS proceduri,
             COALESCE(s.valoare, 0)::numeric AS valoare
        FROM cdc a
        JOIN cnsc c ON c.cui = a.cui
        LEFT JOIN firms.entities e ON e.cui = a.cui
        LEFT JOIN seap s ON s.cui = a.cui
       ORDER BY total_signals DESC, c.contestation_count DESC
       LIMIT 50
    `);
    return result.rows.map((r) => ({
      primary: r.name || `CUI ${r.cui}`,
      primaryHref: `/autoritate/${r.cui}`,
      secondary: `CUI ${r.cui}${r.adr_judet ? ` · ${r.adr_judet}` : ''}`,
      detail: `📋 ${r.audit_count} audituri (${(r.audit_types || []).join('/')}) · ⚖️ ${r.contestation_count} contestații CNSC · ${r.proceduri} proceduri SEAP · ${fmtRON(Number(r.valoare || 0))} RON`,
      metric: `${r.total_signals} semnale`,
      metricRaw: Number(r.total_signals),
      badge: { label: '🚨 dublă alertă', tone: 'risk' },
    }));
  },
};

// ─────────────────────────────────────────────────────────────────────────────

export const RECIPES: Recipe[] = [
  // 8 originale
  directMari,
  modificateMult,
  captureUat,
  q4Spike,
  dependencyExtreme,
  reachExtinde,
  cpvDirectShare,
  crossCounty,
  // 12 noi
  thresholdBunching,
  repeatedWinner,
  savingsSuspect,
  overprice,
  cpvSingleSupplier,
  tedForeign,
  cpvTotal,
  topAuthoritiesByValue,
  topFirmsByValue,
  longestContracts,
  negotiatedNoPub,
  lowSavings,
  // 4 firme (registry ONRC + financiare)
  topFirmsByCifraAfaceri,
  oneEmployeeBigContracts,
  lossWinners,
  newFirmsBigContracts,
  // 8 firme (fonduri EU/AFIR cross-source variants)
  euFundsAndSeap,
  newFirmsEuFunds,
  euOnlyNoSeap,
  afirAndSeap,
  triplePipe,
  benAndAfir,
  afirOnlyTopAbsorbers,
  judeteEuAbsorbtie,
  // 1 RegAS state aid cross
  regasAndSeap,
  // 3 G1 — utility/regulator (ANRE / ANCOM / CNSC) cross-source
  energieFaraLicenta,
  telcoFaraLicenta,
  autoritatiContestate,
  // 3 G2 — financial / audit (ASF / AAAS / Curtea de Conturi)
  asiguratoriFurnizoriStat,
  statActionarSeap,
  autoritatiAuditedRepetitiv,
  // Tick #10 — cross-source double-signal red-flag
  dublaAlerta,
  // Tick #11 — moral hazard cross-source
  donatoriDatornici,
  // Tick #12 — critical infrastructure cross-source
  energieDatornici,
  // Tick #14 — political-leverage cross-source
  donatoriContestatori,
  // ANI flagship — placeholder until full ingest (vezi
  // services/seap-scraper/ANI-PLAN.md)
  politicianFirmaFurnizorStat,
  // Red flags — cross-source signals where law/ethics is at stake
  quadraPipe,
  firmeDatorniceCuContracteSeap,
  donatoriPjCareAuCastigatSeap,
  topDonatoriPerPartid,
];

export const RECIPES_BY_SLUG: Record<string, Recipe> = Object.fromEntries(
  RECIPES.map((r) => [r.slug, r]),
);
