-- Проверки качества данных для tickets

-- Проверка 1: совпадение количества билетов в источнике и STG
DO $$
DECLARE
    v_source_count BIGINT;
    v_stg_count BIGINT;
BEGIN
    -- Количество в источнике (новые билеты)
    SELECT COUNT(*) INTO v_source_count
    FROM (
        SELECT t.ticket_no
        FROM stg.tickets_ext AS t
        JOIN stg.bookings_ext AS b ON t.book_ref = b.book_ref
        WHERE b.book_date > COALESCE(
            (SELECT max(src_created_at_ts) FROM stg.tickets
             WHERE batch_id <> '{{ run_id }}'::text OR batch_id IS NULL),
            TIMESTAMP '1900-01-01 00:00:00'
        )
    ) AS source;

    -- Количество в STG (текущий батч)
    SELECT COUNT(*) INTO v_stg_count
    FROM stg.tickets
    WHERE batch_id = '{{ run_id }}'::text;

    -- Проверка совпадения
    IF v_source_count <> v_stg_count THEN
        RAISE EXCEPTION 'DQ FAILED: несовпадение количества билетов. Источник: %, STG: %',
                          v_source_count, v_stg_count;
    ELSE
        RAISE NOTICE 'DQ PASSED: количество билетов совпадает (%)', v_stg_count;
    END IF;
END $$;

-- Проверка 2: ссылочная целостность (все ticket_no должны иметь соответствующие book_ref)
SELECT
    COUNT(*) AS orphan_tickets
FROM stg.tickets
WHERE batch_id = '{{ run_id }}'::text
    AND NOT EXISTS (
        SELECT 1
        FROM stg.bookings
        WHERE stg.bookings.book_ref = stg.tickets.book_ref
    );
-- Ожидаемое значение: 0

-- Проверка 3: отсутствие NULL в обязательных полях
SELECT
    COUNT(*) AS null_tickets
FROM stg.tickets
WHERE batch_id = '{{ run_id }}'::text
    AND (ticket_no IS NULL OR book_ref IS NULL);
-- Ожидаемое значение: 0
