-- ===============================================
-- Проверки качества данных после загрузки STG→ODS→DDS
-- Запускается после 02_dml_stg-dds.sql (и, при необходимости, 03_demo_increment.sql)
-- ===============================================

-- 1. Проверка: dim_customer не пуста
DO $$
BEGIN
    ASSERT (SELECT COUNT(*) FROM dds.dim_customer) > 0,
        'ОШИБКА: таблица dds.dim_customer пуста — загрузка не прошла';
    RAISE NOTICE '✅ dim_customer: НЕ ПУСТА (всего строк: %)', 
        (SELECT COUNT(*) FROM dds.dim_customer);
END $$;

-- 2. Проверка: каждая строка из ODS попала в DDS-факт
-- Сравниваем количество строк в ods.order_items и dds.fact_sales
DO $$
DECLARE 
    expected_count bigint;
    actual_count   bigint;
BEGIN
    SELECT COUNT(*) INTO expected_count FROM ods.order_items;
    SELECT COUNT(*) INTO actual_count   FROM dds.fact_sales;
    --
    ASSERT actual_count = expected_count,
           format('ОШИБКА: в fact_sales %s строк, а в ods.order_items — %s. Разница: %s',
                  actual_count, expected_count, expected_count - actual_count);
    --
    RAISE NOTICE '✅ fact_sales: количество строк совпадает с ods.order_items (%)', actual_count;
END $$;

-- 3. Проверка SCD Type 2: у клиента 101 должно быть ≥2 версий (из-за смены email)
DO $$
DECLARE version_count INT;
BEGIN
    SELECT COUNT(*) INTO version_count
    FROM dds.dim_customer
    WHERE customer_bk = 101;
    --
    ASSERT version_count >= 2,
        FORMAT('ОШИБКА: у клиента 101 только %s версия, ожидается ≥2 (должна быть история)', version_count);
    RAISE NOTICE '✅ SCD Type 2: клиент 101 имеет % версий — история сохранена', version_count;
END $$;

-- 4. Проверка SCD Type 2: у каждого клиента ровно одна актуальная версия (valid_to IS NULL)
DO $$
DECLARE
    customers_cnt BIGINT;
    current_cnt   BIGINT;
BEGIN
    SELECT COUNT(DISTINCT customer_bk) INTO customers_cnt FROM dds.dim_customer;
    SELECT COUNT(*) INTO current_cnt
    FROM dds.dim_customer
    WHERE valid_to IS NULL;
    --
    ASSERT current_cnt = customers_cnt,
        FORMAT('ОШИБКА: актуальных строк %s, а уникальных клиентов %s (ожидается 1 current на клиента)',
               current_cnt, customers_cnt);
    RAISE NOTICE '✅ SCD Type 2: current-строки = количеству клиентов (%)', current_cnt;
END $$;

-- 5. Проверка SCD Type 2: периоды корректны (valid_to > valid_from или valid_to IS NULL)
DO $$
BEGIN
    ASSERT NOT EXISTS (
        SELECT 1
        FROM dds.dim_customer
        WHERE valid_to IS NOT NULL
          AND valid_to <= valid_from
    ),
    'ОШИБКА: найдены строки dim_customer с некорректным периодом (valid_to <= valid_from)';
    RAISE NOTICE '✅ SCD Type 2: периоды valid_from/valid_to корректны';
END $$;
