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

class OrderLoader(BaseLoader):
    """订单数据加载器"""
    
    def upsert_orders(self, records: list, store_id: int) -> tuple:
        """加载订单数据"""
        if not records:
            return (0, 0, 0)
        
        sql = """
        INSERT INTO billiards.fact_order (
            store_id, order_id, order_no, member_id, table_id,
            order_time, end_time, total_amount, discount_amount,
            final_amount, pay_status, order_status, remark, raw_data
        )
        VALUES (
            %(store_id)s, %(order_id)s, %(order_no)s, %(member_id)s, %(table_id)s,
            %(order_time)s, %(end_time)s, %(total_amount)s, %(discount_amount)s,
            %(final_amount)s, %(pay_status)s, %(order_status)s, %(remark)s, %(raw_data)s
        )
        ON CONFLICT (store_id, order_id) DO UPDATE SET
            order_no = EXCLUDED.order_no,
            member_id = EXCLUDED.member_id,
            table_id = EXCLUDED.table_id,
            order_time = EXCLUDED.order_time,
            end_time = EXCLUDED.end_time,
            total_amount = EXCLUDED.total_amount,
            discount_amount = EXCLUDED.discount_amount,
            final_amount = EXCLUDED.final_amount,
            pay_status = EXCLUDED.pay_status,
            order_status = EXCLUDED.order_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)
