# -*- coding: utf-8 -*-
"""支付事实表加载器"""
from ..base_loader import BaseLoader

class PaymentLoader(BaseLoader):
    """支付数据加载器"""
    
    def upsert_payments(self, records: list, store_id: int) -> tuple:
        """加载支付数据"""
        if not records:
            return (0, 0, 0)
        
        sql = """
        INSERT INTO billiards.fact_payment (
            store_id, pay_id, order_id,
            site_id, tenant_id,
            order_settle_id, order_trade_no,
            relate_type, relate_id,
            create_time, pay_time,
            pay_amount, fee_amount, discount_amount,
            payment_method, pay_type,
            online_pay_channel, pay_terminal,
            pay_status, remark, raw_data
        )
        VALUES (
            %(store_id)s, %(pay_id)s, %(order_id)s,
            %(site_id)s, %(tenant_id)s,
            %(order_settle_id)s, %(order_trade_no)s,
            %(relate_type)s, %(relate_id)s,
            %(create_time)s, %(pay_time)s,
            %(pay_amount)s, %(fee_amount)s, %(discount_amount)s,
            %(payment_method)s, %(pay_type)s,
            %(online_pay_channel)s, %(pay_terminal)s,
            %(pay_status)s, %(remark)s, %(raw_data)s
        )
        ON CONFLICT (store_id, pay_id) DO UPDATE SET
            order_settle_id = EXCLUDED.order_settle_id,
            order_trade_no = EXCLUDED.order_trade_no,
            relate_type = EXCLUDED.relate_type,
            relate_id = EXCLUDED.relate_id,
            order_id = EXCLUDED.order_id,
            site_id = EXCLUDED.site_id,
            tenant_id = EXCLUDED.tenant_id,
            create_time = EXCLUDED.create_time,
            pay_time = EXCLUDED.pay_time,
            pay_amount = EXCLUDED.pay_amount,
            fee_amount = EXCLUDED.fee_amount,
            discount_amount = EXCLUDED.discount_amount,
            payment_method = EXCLUDED.payment_method,
            pay_type = EXCLUDED.pay_type,
            online_pay_channel = EXCLUDED.online_pay_channel,
            pay_terminal = EXCLUDED.pay_terminal,
            pay_status = EXCLUDED.pay_status,
            remark = EXCLUDED.remark,
            raw_data = EXCLUDED.raw_data,
            updated_at = now()
        RETURNING (xmax = 0) AS inserted
        """
        
        inserted, updated = self.db.batch_upsert_with_returning(sql, records, page_size=self._batch_size())
        return (inserted, updated, 0)
