-- Динамическая конфигурация Objective sync — single-row settings.
--
-- Зачем нужна:
--   1. В админке /admin/scrape/objective можно менять параметры запроса
--      (groups, use_ddu/dkp, period_months_back, inter_group_delay) без редеплоя.
--   2. Cron-расписание тоже хранится здесь — Celery beat читает его при старте.
--      Изменение требует restart beat-контейнера (это указано в UI как hint).
--
-- Pattern: single-row (id=1), UPSERT для безопасных обновлений.
-- Если строки нет — task/beat падают на settings.* env как fallback.

CREATE TABLE IF NOT EXISTS objective_sync_config (
    id                      SMALLINT PRIMARY KEY DEFAULT 1 CHECK (id = 1),
    -- Cron-расписание для Celery beat (5-полевой формат: 'minute hour dom month dow').
    -- Celery beat перечитывает это поле только при старте — после изменения
    -- нужен `docker compose restart beat`.
    cron_schedule           TEXT NOT NULL DEFAULT '0 6 * * tue',
    -- Группы для sync (csv). Эмпирически проверены на тарифе:
    -- 'Свердловская область', 'Челябинск', 'Тюмень', 'Пермь',
    -- 'Екатеринбург', 'Верхняя Пышма', 'Берёзовский', 'Нижний Тагил',
    -- 'Каменск-Уральский', 'Первоуральск', 'Новоуральск', 'Сысерть'.
    groups_csv              TEXT NOT NULL DEFAULT 'Свердловская область,Челябинск,Тюмень,Пермь',
    -- Параметры запроса /v2/Report/GetReport.
    use_ddu                 BOOLEAN NOT NULL DEFAULT TRUE,
    use_dkp                 BOOLEAN NOT NULL DEFAULT TRUE,
    -- Сколько месяцев назад тянуть для Сводных отчётов (corp_sum).
    -- 1 = только последний полный месяц (default). 12 = весь год.
    -- Поквартирные/Лоты не имеют дат — всегда snapshot.
    period_months_back      SMALLINT NOT NULL DEFAULT 1 CHECK (period_months_back BETWEEN 1 AND 24),
    -- Пауза между группами в одном task'е (секунды). Защита от 429.
    inter_group_delay_s     SMALLINT NOT NULL DEFAULT 30 CHECK (inter_group_delay_s BETWEEN 0 AND 300),
    -- Пауза между HTTP-запросами в client (мс). Передаётся в ObjectiveClient(rate_ms=…).
    rate_ms                 SMALLINT NOT NULL DEFAULT 3000 CHECK (rate_ms BETWEEN 0 AND 10000),
    -- Сколько ретраев на 429/5xx.
    retries                 SMALLINT NOT NULL DEFAULT 2 CHECK (retries BETWEEN 0 AND 5),
    updated_at              timestamptz NOT NULL DEFAULT NOW(),
    updated_by              TEXT
);

COMMENT ON TABLE objective_sync_config IS
    'Single-row динамическая конфигурация Objective sync. Все task-ы и beat '
    'читают отсюда. Если строки нет — fallback на settings.* env.';

-- Засеваем единственную строку с дефолтами (если ещё не создана).
INSERT INTO objective_sync_config (id) VALUES (1)
ON CONFLICT (id) DO NOTHING;
