$parse = DateTime::Parse('%Y-%m-%d');
$format = DateTime::Format('%Y-%m-%d');
$msk_timezone = ($value) -> {RETURN AddTimezone(CAST($value as Datetime), 'Europe/Moscow');};

$path = '//home/comdep-analytics/public/rewards/';
$ar_contracts_path = $path || 'contracts_hist/' || $format(CurrentUtcDate());
$all_rewards_path = $path || 'rewards_hist/' || $format(CurrentUtcDate());
$manual_rewards_path = $path || 'manual_rewards';

PRAGMA yt.InferSchema = '1';
USE hahn;

$all_contracts = (
SELECT
    contract_id,
    contract_eid,
    tp, --Тип договора, посчитанный биллингом (на самом деле, это какая-то техническая история. Типы договоров лучше разбивать по названию шкалы)
    till_dt, --Конец отчетного периода
    agency_id,
    agency_name,
    scale_name,
    discount_type_src,
    discount_type, --Продукт
    reward_type, --M/Q/H (Y никак не отражается)
    currency,
    SUM(CAST(r.reward_to_charge AS Double)) AS reward_to_charge,
    SUM(CAST(r.turnover_to_charge AS Double)) AS turnover_to_charge,
    SUM(CAST(r.delkredere_to_charge AS Double)) AS delkredere_to_charge
FROM `//home/balance/prod/bo/v_ar_rewards` AS r
LEFT JOIN `//home/balance/prod/bo/v_contract_apex_full` AS a ON r.contract_id == a.contract_id
WHERE
    a.contract_type IN (1, 61, 62) --Комиссионный и Оптовый агентский, премия, 62 - Беларусь
    AND SUBSTRING(CAST($msk_timezone(r.till_dt) AS String), NULL, 10) >= '2016-01-01'
    AND CAST(r.reward_to_charge AS Double) > 0
GROUP BY
    r.contract_id AS contract_id,
    r.contract_eid AS contract_eid,
    IF(a.agency_id == 1909056, 'МО', r.tp) AS tp, --Костыль для Хурры, которая относится к МО, но шкала - проф
    SUBSTRING(CAST($msk_timezone(r.till_dt) AS String), NULL, 10) AS till_dt,
    a.agency_id AS agency_id,
    a.agency_name AS agency_name,
    IF(a.contract_type IN (61, 62), a.wsale_ag_prm_awrd_sc_tp, a.commission_name) AS scale_name, --Для оптового агентского - шкала премии, для комиссионного - шкала комиссии (Женя С.)
    r.discount_type ?? 0 AS discount_type_src, --Для фильтрации дальше
    (CASE
        WHEN r.tp == 'audio' THEN 'Медийка'
        WHEN r.discount_type == 7 THEN 'Директ'
        WHEN r.discount_type == 1 THEN 'Медийка' --+часть видео, аудио и гео
        WHEN r.discount_type IN (2, 3, 4, 8, 9, 10, 13, 24, 25, 26, 27, 31, 32) THEN 'Медийка' --25 - это медийка Вертикалей
        WHEN r.discount_type == 29 THEN 'Медийка' --Аудиореклама
        WHEN r.discount_type == 37 THEN 'Медийка' --Медийка в Директе
        WHEN r.discount_type == 17 THEN 'Медийка' --Спецпроекты
        WHEN r.discount_type == 38 then 'Медийка' --Частные сделки
        WHEN r.discount_type == 36 THEN 'Видеореклама'
        WHEN r.discount_type == 0 THEN 'Остальное' --Без привязки к продукту
        WHEN r.discount_type == 71 THEN 'Остальное' --Старый ЛК
        WHEN r.discount_type IS NULL THEN 'Остальное' --За всё
        WHEN r.discount_type IN (12, 15) THEN 'Справочник'
        ELSE CAST(r.discount_type AS String)
    END) AS discount_type,
    (CASE
        WHEN r.reward_type IN (2, 202, 302) AND r.tp == 'belarus' THEN 'Q' --Беларусские кварталки в биллинге хранятся под H (ошибка)
        WHEN r.reward_type IN (1, 10, 201, 210, 301, 310) THEN 'M'
        WHEN r.reward_type == 311 THEN 'M' --Досрочная оплата (отнесла к М по ТЗ)
        WHEN r.reward_type == 312 THEN 'M' --Предоставление финансовой отчетности (отнесла к М по ТЗ)
        WHEN r.reward_type IN (20, 220, 320) THEN 'Q'
        WHEN r.reward_type IN (3, 203, 303) THEN 'Q' --Региональная программа
        WHEN r.reward_type IN (2, 202, 302) THEN 'H'
        ELSE CAST(r.reward_type AS String)
    END) AS reward_type,
    r.currency AS currency
    );

$filtered_contracts = (
SELECT
    contract_id,
    contract_eid,
    tp,
    till_dt,
    agency_id,
    agency_name,
    scale_name,
    discount_type,
    reward_type,
    currency,
    SUM(reward_to_charge) AS reward_to_charge,
    SUM(turnover_to_charge) AS turnover_to_charge,
    SUM(delkredere_to_charge) AS delkredere_to_charge
FROM $all_contracts
WHERE
    agency_id NOT IN (393872, 31065937) --ИМХО/ИМХО Вертикали
    AND scale_name NOT IN (
        'Казахстан',
        'Маркет 2016', 'Маркет, регионы 2016', 'Маркет, спецпроекты',
        'Недвижимость 2017', 'Недвижимость Регионы 2017',
        'Яндекс.Авто'
        )
    --Вычищаю по discount_type, поскольку может быть зашито в стандартный договор (остальные discount_type c 2016 года не встречаются)
    AND discount_type_src NOT IN (11, 33, 40, 42) --Маркет/спецпроекты Маркета/Дзен/Взгляд
GROUP BY
    contract_id,
    contract_eid,
    tp,
    till_dt,
    agency_id,
    agency_name,
    scale_name,
    discount_type,
    reward_type,
    currency
);

INSERT INTO $ar_contracts_path WITH TRUNCATE
SELECT * FROM $filtered_contracts
ORDER BY till_dt ASC;

COMMIT;

$pre_retro_contracts = (
SELECT
    contract_id,
    contract_eid,
    'МО' AS tp,
    till_dt,
    agency_id,
    agency_name,
    'МО' AS scale_name,
    discount_type_src,
    discount_type,
    reward_type,
    currency,
    SUM(CAST(r.reward_to_charge AS Double)) AS reward_to_charge,
    SUM(CAST(r.turnover_to_charge AS Double)) AS turnover_to_charge,
    SUM(CAST(r.delkredere_to_charge AS Double)) AS delkredere_to_charge
FROM `//home/balance/prod/bo/v_commission_retro_reward` AS r
LEFT JOIN `//home/balance/prod/bo/v_contract_apex_full` AS a ON r.contract_id == a.contract_id
WHERE
    SUBSTRING(CAST($msk_timezone(r.till_dt) AS String), NULL, 10) >= '2016-01-01'
    AND CAST(r.reward_to_charge AS Double) > 0
GROUP BY
    r.contract_id AS contract_id,
    r.contract_eid AS contract_eid,
    SUBSTRING(CAST($msk_timezone(r.till_dt) AS String), NULL, 10) AS till_dt,
    a.agency_id AS agency_id,
    a.agency_name AS agency_name,
    CAST(r.discount_type AS Int64) ?? 0 AS discount_type_src, --Для фильтрации дальше
    CAST(r.discount_type AS Int64) ?? 0 AS discount_type,
    CAST(reward_type AS Int64) ?? 0 AS reward_type,
    r.currency AS currency
    );

$retro_contracts = (
SELECT
    contract_id,
    contract_eid,
    tp,
    till_dt,
    agency_id,
    agency_name,
    scale_name,
    discount_type,
    reward_type,
    currency,
    SUM(reward_to_charge) AS reward_to_charge,
    SUM(turnover_to_charge) AS turnover_to_charge,
    SUM(delkredere_to_charge) AS delkredere_to_charge
FROM $pre_retro_contracts
GROUP BY
    CAST(contract_id AS Int64) AS contract_id,
    CAST(contract_eid AS Utf8) AS contract_eid,
    CAST(tp AS Utf8) AS tp,
    CAST(till_dt AS String) AS till_dt,
    CAST(agency_id AS Int64) AS agency_id,
    CAST(agency_name AS Utf8) AS agency_name,
    CAST(scale_name AS Utf8) AS scale_name,
    (CASE
        WHEN discount_type == 7 THEN 'Директ'
        WHEN discount_type == 1 THEN 'Медийка' --+часть видео, аудио и гео
        WHEN discount_type IN (2, 3, 4, 8, 9, 10, 13, 24, 25, 26, 27, 31, 32) THEN 'Медийка' --25 - это медийка Вертикалей
        WHEN discount_type == 29 THEN 'Медийка' --Аудиореклама
        WHEN discount_type == 37 THEN 'Медийка' --Медийка в Директе
        WHEN discount_type == 17 THEN 'Медийка' --Спецпроекты
        WHEN discount_type == 38 then 'Медийка' --Частные сделки
        WHEN discount_type == 36 THEN 'Видеореклама'
        WHEN discount_type == 0 THEN 'Остальное' --Без привязки к продукту
        WHEN discount_type == 71 THEN 'Остальное' --Старый ЛК
        WHEN discount_type IS NULL THEN 'Остальное' --За всё
        WHEN discount_type IN (12, 15) THEN 'Справочник'
        ELSE CAST(discount_type AS String)
    END) AS discount_type,
    (CASE
        WHEN reward_type IN (1, 10, 201, 210, 301, 310) THEN 'M'
        WHEN reward_type == 311 THEN 'M' --Досрочная оплата (отнесла к М по ТЗ)
        WHEN reward_type == 312 THEN 'M' --Предоставление финансовой отчетности (отнесла к М по ТЗ)
        WHEN reward_type IN (20, 220, 320) THEN 'Q'
        WHEN reward_type IN (3, 203, 303) THEN 'Q' --Региональная программа
        WHEN reward_type IN (2, 202, 302) THEN 'H'
        ELSE CAST(reward_type AS String)
    END) AS reward_type,
    CAST(currency AS Utf8) AS currency
);

INSERT INTO $ar_contracts_path
SELECT * FROM $retro_contracts
ORDER BY till_dt ASC;

COMMIT;

$agenicies = (
SELECT
    tp_new,
    dt,
    agency_id,
    agency_name,
    scale_name,
    discount_type,
    reward_type,
    currency,
    cur_rate,
    (CASE
        WHEN r.currency NOT IN ('RUB', 'RUR') THEN SUM(cur_rate * r.reward_to_charge)
        ELSE SUM(r.reward_to_charge)
    END) AS reward_to_charge_rur,
    SUM(reward_to_charge) AS reward_to_charge_cur,
    (CASE
        WHEN r.currency NOT IN ('RUB', 'RUR') THEN SUM(cur_rate * r.turnover_to_charge)
        ELSE SUM(r.turnover_to_charge)
    END) AS turnover_to_charge_rur,
    SUM(turnover_to_charge) AS turnover_to_charge_cur,
    (CASE
        WHEN r.currency NOT IN ('RUB', 'RUR') THEN SUM(cur_rate * r.delkredere_to_charge)
        ELSE SUM(r.delkredere_to_charge)
    END) AS delkredere_to_charge_rur,
    SUM(delkredere_to_charge) AS delkredere_to_charge_cur
FROM $ar_contracts_path AS r
LEFT JOIN `//home/balance/prod/bo/mv_currency_rate` AS cur_rates ON r.currency == cur_rates.cc AND r.till_dt == cur_rates.rate_dt
GROUP BY
    (CASE
        WHEN r.tp == 'МО' OR r.scale_name == 'МО' THEN 'МО'
        WHEN r.scale_name IN ('Базовый 2013', 'Базовая 2015', 'Базовая СПб', 'Базовая, регионы 2015') THEN 'База'
        WHEN r.scale_name == 'Базовая лайт' THEN 'База_лайт'
        WHEN r.scale_name == 'Премии Беларусь' THEN 'Беларусь'
        WHEN r.scale_name IN ('Интерко премия 2017', 'Медийка Вертикали 2017', 'Нет') THEN 'Интерко' --Нет - Агентство Яндекс.Маркет
        WHEN r.scale_name == 'Нерезиденты 2015' THEN 'Нерезиденты'
        WHEN r.scale_name IN ('Аудиореклама 2015', 'Справочник', 'НЭЙМ') THEN 'Остальное'
        WHEN r.scale_name IN ('Премиум 2015', 'Профессиональный 2013') THEN 'Проф'
        WHEN r.scale_name == 'Спецпроекты' THEN 'Спецпроекты'
        ELSE r.scale_name
    END) AS tp_new,
    $format(DateTime::StartOfMonth(DateTime::MakeDatetime($parse(r.till_dt)))) AS dt,
    r.agency_id AS agency_id,
    r.agency_name AS agency_name,
    r.scale_name AS scale_name,
    r.discount_type as discount_type,
    r.reward_type AS reward_type,
    r.currency AS currency,
    IF(r.currency IN ('RUB', 'RUR'), 1, CAST(cur_rates.rate AS Double)) AS cur_rate
);

INSERT INTO $all_rewards_path WITH TRUNCATE
SELECT * FROM $agenicies
ORDER BY dt ASC;

COMMIT;

INSERT INTO $all_rewards_path
SELECT
    tp_new,
    dt,
    agency_id,
    agency_name,
    scale_name,
    discount_type,
    reward_type,
    currency,
    cur_rate,
    SUM(CAST(reward_to_charge_rur AS Double)) AS reward_to_charge_rur,
    SUM(CAST(reward_to_charge_cur AS Double)) AS reward_to_charge_cur,
    SUM(CAST(turnover_to_charge_rur AS Double)) AS turnover_to_charge_rur,
    SUM(CAST(turnover_to_charge_cur AS Double)) AS turnover_to_charge_cur,
    SUM(CAST(delkredere_to_charge_rur AS Double)) AS delkredere_to_charge_rur,
    SUM(CAST(delkredere_to_charge_cur AS Double)) AS delkredere_to_charge_cur
FROM $manual_rewards_path
GROUP BY
    CAST(tp_new AS Utf8) ?? 'None' AS tp_new,
    CAST(dt AS String) AS dt,
    CAST(agency_id AS Int64) ?? NULL AS agency_id,
    CAST(agency_name AS Utf8) ?? 'None' AS agency_name,
    CAST(scale_name AS Utf8) ?? 'None' AS scale_name,
    CAST(discount_type AS String) ?? 'None' AS discount_type,
    CAST(reward_type AS String) ?? 'None' AS reward_type,
    CAST(currency AS Utf8) ?? 'None' AS currency,
    CAST(cur_rate AS Double) ?? NULL AS cur_rate
ORDER BY dt ASC;

COMMIT;
