"""
Data-Quality Gate — Premium ETL เฟส 2
=====================================
กรองข้อมูลก่อนเข้าคลัง: ยอด/จำนวนติดลบ, sku ว่าง, คีย์ซ้ำในชุดเดียวกัน
"ความพังถูกกัน ไม่ปล่อยให้ corrupt warehouse" — บันทึก reject ไว้ ไม่ทิ้งเงียบ

pure stdlib — รัน/เทสได้โดยไม่ต้องมี dependency
"""
from __future__ import annotations


def check_orders(orders: list[dict]) -> tuple[list, list]:
    """คืน (clean, rejected). rejected = [{record, reason}]"""
    clean, rejected, seen = [], [], set()
    for o in orders:
        reason = None
        if not o.get("sku"):
            reason = "missing sku"
        elif float(o.get("total_amount", 0)) < 0:
            reason = "negative total_amount"
        elif int(o.get("qty", 0)) < 0:
            reason = "negative qty"
        else:
            key = (o.get("platform"), o.get("platform_order_id"), o.get("sku"))
            if key in seen:
                reason = "duplicate natural key in batch"
            else:
                seen.add(key)
        (rejected if reason else clean).append({"record": o, "reason": reason} if reason else o)
    return clean, rejected


def check_inventory(inventory: list[dict]) -> tuple[list, list]:
    clean, rejected, seen = [], [], set()
    for i in inventory:
        reason = None
        if not i.get("sku"):
            reason = "missing sku"
        elif int(i.get("stock", 0)) < 0:
            reason = "negative stock"
        else:
            key = (i.get("platform"), i.get("sku"))
            if key in seen:
                reason = "duplicate (platform, sku) in snapshot"
            else:
                seen.add(key)
        (rejected if reason else clean).append({"record": i, "reason": reason} if reason else i)
    return clean, rejected


def quality_gate(payload: dict) -> dict:
    """รับ output ของเฟส 1 -> คืนข้อมูลสะอาด + รายการที่ถูก reject (ไม่ทำให้ทั้ง batch ล้ม)."""
    clean_o, rej_o = check_orders(payload.get("orders", []))
    clean_i, rej_i = check_inventory(payload.get("inventory", []))
    return {
        "clean_orders": clean_o,
        "clean_inventory": clean_i,
        "rejected": rej_o + rej_i,
        "ok": len(rej_o) + len(rej_i) == 0,
        "stats": {
            "orders_in": len(payload.get("orders", [])), "orders_clean": len(clean_o),
            "inventory_in": len(payload.get("inventory", [])), "inventory_clean": len(clean_i),
            "rejected": len(rej_o) + len(rej_i),
        },
    }
