-- 021_regas_ajutoare.sql
-- RegAS — Registrul Ajutoarelor de Stat (Consiliul Concurenței).
-- Source: https://regas.consiliulconcurentei.ro/transparenta/index.html
-- API: POST /apitransparenta/cautareTransparenta (XSRF-TOKEN cookie + header)
-- Volume at first scrape (2026-05-09): 132,363 ajutoare individuale.
--
-- Each row = one ajutor de stat acordat unei firme (denumireBeneficiar+cui),
-- cu masura (referintaMasura SA.xxx/yyyy), categorie/subcategorie, suma în RON,
-- finantator (ministerul/agentia care a dat banii), instrumentAcordare
-- (fonduri nerambursabile / credite / garantii / scutiri).
--
-- Cheie naturală: (cui, idMasura, dataAcordare, ajutorAcordatSubcategorie) —
-- același beneficiar poate primi multiple tranșe pe aceeași măsură. Folosim
-- un id sintetic SHA1 pentru ON CONFLICT idempotent.

CREATE SCHEMA IF NOT EXISTS regas;

CREATE TABLE IF NOT EXISTS regas.ajutoare (
  id                          char(40) PRIMARY KEY,        -- sha1(cui|idMasura|dataAcordare|subcategorie|sumaSubcategorie)
  cui                         text NOT NULL,
  denumire_beneficiar         text NOT NULL,
  raf                         text,                        -- "Registrul Ajutoarelor Fiscale" id (rare)
  alt_cod                     text,                        -- ID alternativ (rare)
  dimensiune_intreprindere    text,                        -- "întreprindere mare" / "IMM" / etc.
  regiune                     text[],                      -- ["Regiunea I Nord-Est", ...] sau ["Toate regiunile"]
  domeniu_activitate          text,                        -- CAEN cod (4 digits)
  data_acordare               date,                        -- "DD/MM/YYYY" parsed
  id_masura                   integer NOT NULL,            -- FK logic la /apitransparenta/downloadPdfMasura/{idMasura}
  denumire_masura             text NOT NULL,
  referinta_masura            text,                        -- "SA.104966/2022"
  activitati_finantate        text[],                      -- CAEN codes
  categorie                   text,
  subcategorie                text,
  obiectiv                    text,
  ajutor_acordat_categorie    numeric(20,2),               -- RON
  ajutor_acordat_subcategorie numeric(20,2),               -- RON (de obicei = categorie pentru o singură subcategorie)
  intermediari_financiari     text[],
  executanti                  text[],
  instrument_acordare         text,                        -- "fonduri nerambursabile" / "garantii" / "credite"
  intensitate                 numeric(6,2),                -- procent (e.g. 65.00)
  finantator                  text,                        -- "Ministerul ... (MIPE)"
  pdf_masura                  text,                        -- "1195_MASURA.pdf"
  fetched_at                  timestamptz DEFAULT now(),
  raw_json                    jsonb
);

CREATE INDEX IF NOT EXISTS idx_regas_ajutoare_cui ON regas.ajutoare(cui);
CREATE INDEX IF NOT EXISTS idx_regas_ajutoare_data ON regas.ajutoare(data_acordare DESC NULLS LAST);
CREATE INDEX IF NOT EXISTS idx_regas_ajutoare_finantator ON regas.ajutoare(finantator);
CREATE INDEX IF NOT EXISTS idx_regas_ajutoare_referinta ON regas.ajutoare(referinta_masura);
CREATE INDEX IF NOT EXISTS idx_regas_ajutoare_id_masura ON regas.ajutoare(id_masura);

COMMENT ON TABLE regas.ajutoare IS
  'State aid records from Consiliul Concurentei RegAS portal. One row per ajutor acordat. Source: https://regas.consiliulconcurentei.ro/transparenta/';

COMMENT ON COLUMN regas.ajutoare.id IS
  'Synthetic sha1 of (cui|idMasura|dataAcordare|subcategorie|ajutorAcordatSubcategorie). Used for idempotent upsert.';

-- Materialized view aggregating per CUI for fast firma profile lookup.
CREATE MATERIALIZED VIEW IF NOT EXISTS regas.mv_ajutoare_per_cui AS
SELECT
  cui,
  COUNT(*) AS nr_ajutoare,
  SUM(ajutor_acordat_subcategorie) AS total_ron,
  COUNT(DISTINCT id_masura) AS nr_masuri,
  COUNT(DISTINCT finantator) AS nr_finantatori,
  MIN(data_acordare) AS prima_acordare,
  MAX(data_acordare) AS ultima_acordare,
  array_agg(DISTINCT finantator) FILTER (WHERE finantator IS NOT NULL) AS finantatori,
  array_agg(DISTINCT instrument_acordare) FILTER (WHERE instrument_acordare IS NOT NULL) AS instrumente
FROM regas.ajutoare
GROUP BY cui;

CREATE UNIQUE INDEX IF NOT EXISTS idx_regas_mv_cui ON regas.mv_ajutoare_per_cui(cui);
