{% set ok_status = ("Approved", "Flagged") %}
{% set rejected_status = "Rejected" %}
{% set rejected_fee = 0.25 %}
{% set cancellation_fee = 0.25 %}
{% set cancellation_threshold = 0.05 %}
with
    int_edeposit__verifications as (
        select * from {{ ref("int_edeposit__verifications") }}
    ),
    stg_core__edeposit_user as (select * from {{ ref("stg_core__edeposit_user") }}),
    int_daily_currency_exchange_rates as (
        select * from {{ ref("int_daily_currency_exchange_rates") }}
    ),
    edeposit_records as (
        select
            v.id_verification,
            v.id_user_partner,
            v.id_booking,
            eu.currency,
            cer.rate,
            v.is_cancelled,
            case
                when v.verification_status in {{ ok_status }}
                then v.nightly_fee_local * v.number_nights
                else 0
            end as ok_status_fee_in_txn_currency,
            case
                when v.verification_status in {{ ok_status }}
                then cer.rate * v.nightly_fee_local * v.number_nights
                else 0
            end as ok_status_fee_in_gbp,
            case
                when v.verification_status = '{{ rejected_status }}'
                then {{ rejected_fee }}
                else 0
            end as rejected_fee_in_txn_currency,
            case
                when v.verification_status = '{{ rejected_status }}'
                then cer.rate * {{ rejected_fee }}
                else 0
            end as rejected_fee_in_gbp,
            to_char(v.checkout_at_utc, 'YYYY-MM') as year_month_checkout
        from int_edeposit__verifications v
        inner join stg_core__edeposit_user eu on v.id_user_partner = eu.id_user_partner
        left join
            int_daily_currency_exchange_rates cer
            on cer.from_currency = eu.currency
            and cer.rate_date_utc = v.checkout_date_utc
            and cer.to_currency = 'GBP'
        where version = 'V2'
    ),
    monthly_cancellation_threshold as (
        select
            id_user_partner,
            year_month_checkout,
            case
                when
                    sum(cast(is_cancelled as integer))::decimal / count(id_booking)
                    >= {{ cancellation_threshold }}
                then true
                else false
            end as is_cancellation_threshold_surpassed
        from edeposit_records
        group by id_user_partner, year_month_checkout
    )
select
    v.id_verification,
    v.id_booking,
    er.currency,
    er.ok_status_fee_in_txn_currency,
    er.ok_status_fee_in_gbp,
    er.rejected_fee_in_txn_currency,
    er.rejected_fee_in_gbp,
    case
        when ct.is_cancellation_threshold_surpassed is true
        then {{ cancellation_fee }}
        else 0
    end as cancelled_fee_in_txn_currency,
    case
        when ct.is_cancellation_threshold_surpassed is true
        then rate * {{ cancellation_fee }}
        else 0
    end as cancelled_fee_in_gbp,
    v.created_date_utc,
    v.checkout_date_utc
from int_edeposit__verifications v
inner join edeposit_records er on er.id_verification = v.id_verification
inner join
    monthly_cancellation_threshold ct
    on (
        er.id_user_partner = ct.id_user_partner
        and er.year_month_checkout = ct.year_month_checkout
    )
