-- =============================================================
-- V007__rolling_replanning.sql
-- EMS Platform – rozšíření planning_run o rolling horizon typ
--               a forecast korekční faktory
-- =============================================================

-- ============================================================
-- Rozšíření planning_run o typ a kontext replanningu
-- ============================================================

ALTER TABLE ems.planning_run
    ADD COLUMN IF NOT EXISTS run_type        TEXT NOT NULL DEFAULT 'daily',
    ADD COLUMN IF NOT EXISTS triggered_by    TEXT,
    ADD COLUMN IF NOT EXISTS replan_from     TIMESTAMPTZ,
    ADD COLUMN IF NOT EXISTS soc_at_replan_wh NUMERIC(10,2),
    ADD COLUMN IF NOT EXISTS solver_duration_ms INT,
    ADD COLUMN IF NOT EXISTS forecast_correction_factor NUMERIC(6,4);

COMMENT ON COLUMN ems.planning_run.run_type IS
'Typ plánovacího běhu:
  daily   = hlavní denní plán (15:00, horizont 36h)
  rolling = průběžný replan každých 15min
  manual  = spuštěno ručně z UI nebo API';

COMMENT ON COLUMN ems.planning_run.triggered_by IS
'Co spustilo tento plánovací běh:
  scheduler:daily, scheduler:rolling, user:jan, api, override_change';

COMMENT ON COLUMN ems.planning_run.replan_from IS
'Od kterého slotu byl plán přepočítán (pro rolling). NULL pro daily plán.
Sloty před replan_from jsou převzaty z předchozího aktivního plánu.';

COMMENT ON COLUMN ems.planning_run.soc_at_replan_wh IS
'Skutečný SoC baterie v Wh v okamžiku replanningu (z telemetrie).
Vstupní podmínka pro solver – zpřesňuje počáteční SoC oproti dennímu plánu.';

COMMENT ON COLUMN ems.planning_run.solver_duration_ms IS
'Čas výpočtu LP solveru v milisekundách. Pro monitoring výkonu.';

COMMENT ON COLUMN ems.planning_run.forecast_correction_factor IS
'Korekční faktor aplikovaný na FVE forecast při tomto replanningu.
Vypočten z poměru skutečné vs. předpovídané výroby za posledních 60 minut.
1.0 = žádná korekce, 0.8 = skutečnost byla 80% forecastu.';

-- ============================================================
-- Rozšíření planning_interval o per-EV setpointy
-- (nahrazuje jeden agregovaný ev_charge_power_w)
-- ============================================================

ALTER TABLE ems.planning_interval
    ADD COLUMN IF NOT EXISTS ev1_setpoint_w INT,
    ADD COLUMN IF NOT EXISTS ev2_setpoint_w INT,
    ADD COLUMN IF NOT EXISTS ev1_via_bat_w  INT NOT NULL DEFAULT 0,
    ADD COLUMN IF NOT EXISTS ev2_via_bat_w  INT NOT NULL DEFAULT 0;

COMMENT ON COLUMN ems.planning_interval.ev1_setpoint_w IS
'Plánovaný celkový výkon nabíjení EV nabíječky 1 (Tesla) v W. NULL = auto nepřipojeno.';

COMMENT ON COLUMN ems.planning_interval.ev2_setpoint_w IS
'Plánovaný celkový výkon nabíjení EV nabíječky 2 (Zoe) v W. NULL = auto nepřipojeno.';

COMMENT ON COLUMN ems.planning_interval.ev1_via_bat_w IS
'Část výkonu EV1 která jde přes baterii (round-trip ztráta). 0 = přímé napájení.';

COMMENT ON COLUMN ems.planning_interval.ev2_via_bat_w IS
'Část výkonu EV2 která jde přes baterii (round-trip ztráta). 0 = přímé napájení.';

-- ============================================================
-- Tabulka forecast korekcí – pro analýzu přesnosti
-- ============================================================

CREATE TABLE IF NOT EXISTS ems.forecast_correction_log (
    id              SERIAL PRIMARY KEY,
    site_id         INT NOT NULL REFERENCES ems.site(id),
    logged_at       TIMESTAMPTZ NOT NULL DEFAULT now(),
    window_start    TIMESTAMPTZ NOT NULL,   -- začátek okna pro výpočet faktoru
    window_end      TIMESTAMPTZ NOT NULL,
    actual_pv_wh    NUMERIC(12,3),          -- skutečná výroba za okno
    forecast_pv_wh  NUMERIC(12,3),          -- předpovídaná výroba za okno
    correction_factor NUMERIC(6,4),         -- actual / forecast
    applied_to_run_id INT REFERENCES ems.planning_run(id)
);

COMMENT ON TABLE ems.forecast_correction_log IS
'Log výpočtu korekčních faktorů FVE forecastu. Každý rolling replan zaznamená
poměr skutečné vs. předpovídané výroby za posledních 60 minut. Slouží pro
analýzu přesnosti forecastu a ladění modelu.';

COMMENT ON COLUMN ems.forecast_correction_log.correction_factor IS
'Poměr actual_pv_wh / forecast_pv_wh. Hodnoty typicky 0.5–1.5.
Extrémní hodnoty (oblačnost, porucha) jsou odfiltrovány v kódu (clamp 0.5–1.5).';
