# -*- coding: utf-8 -*-
"""余额一致性检查器"""
from .base_checker import BaseDataQualityChecker

class BalanceChecker(BaseDataQualityChecker):
    """检查订单、支付、退款的金额一致性"""
    
    def check(self, store_id: int, start_date: str, end_date: str) -> dict:
        """
        检查指定时间范围内的余额一致性
        
        验证: 订单总额 = 支付总额 - 退款总额
        """
        checks = []
        
        # 查询订单总额
        sql_orders = """
        SELECT COALESCE(SUM(final_amount), 0) AS total
        FROM billiards.fact_order
        WHERE store_id = %s
          AND order_time >= %s
          AND order_time < %s
          AND order_status = 'COMPLETED'
        """
        order_total = self.db.query(sql_orders, (store_id, start_date, end_date))[0]["total"]
        
        # 查询支付总额
        sql_payments = """
        SELECT COALESCE(SUM(pay_amount), 0) AS total
        FROM billiards.fact_payment
        WHERE store_id = %s
          AND pay_time >= %s
          AND pay_time < %s
          AND pay_status = 'SUCCESS'
        """
        payment_total = self.db.query(sql_payments, (store_id, start_date, end_date))[0]["total"]
        
        # 查询退款总额
        sql_refunds = """
        SELECT COALESCE(SUM(refund_amount), 0) AS total
        FROM billiards.fact_refund
        WHERE store_id = %s
          AND refund_time >= %s
          AND refund_time < %s
          AND refund_status = 'SUCCESS'
        """
        refund_total = self.db.query(sql_refunds, (store_id, start_date, end_date))[0]["total"]
        
        # 验证余额
        expected_total = payment_total - refund_total
        diff = abs(float(order_total) - float(expected_total))
        threshold = 0.01  # 1分钱的容差
        
        passed = diff < threshold
        
        checks.append({
            "name": "balance_consistency",
            "passed": passed,
            "message": f"订单总额: {order_total}, 支付-退款: {expected_total}, 差异: {diff}",
            "details": {
                "order_total": float(order_total),
                "payment_total": float(payment_total),
                "refund_total": float(refund_total),
                "diff": diff
            }
        })
        
        all_passed = all(c["passed"] for c in checks)
        
        return {
            "passed": all_passed,
            "checks": checks
        }
