"""
Canonical normalized records — Premium ETL เฟส 1 (Data Ingestion)
================================================================
ทุก connector แปลงข้อมูลดิบของแต่ละแพลตฟอร์มให้อยู่ใน schema กลางนี้
เพื่อให้เฟส 2 (loader → Postgres) รับไป UPSERT ได้ทันที (ตรงกับ schema.sql ใน blueprint)

ใช้ stdlib ล้วน (dataclasses) — ไม่มี dependency ภายนอก
"""
from __future__ import annotations

from dataclasses import dataclass, asdict, field
from datetime import datetime, timezone


def _now_iso() -> str:
    return datetime.now(timezone.utc).isoformat(timespec="seconds")


@dataclass(frozen=True)
class OrderRecord:
    platform: str
    platform_order_id: str
    order_date: str          # ISO-8601
    total_amount: float
    status: str
    sku: str
    qty: int
    unit_price: float

    def key(self) -> tuple:
        """Natural key — ตรงกับ PRIMARY KEY ของตาราง orders (เฟส 2 ใช้ dedupe/UPSERT)."""
        return (self.platform, self.platform_order_id, self.sku)

    def to_dict(self) -> dict:
        return asdict(self)


@dataclass(frozen=True)
class InventoryRecord:
    platform: str
    sku: str
    stock: int
    updated_at: str = field(default_factory=_now_iso)

    def key(self) -> tuple:
        return (self.platform, self.sku)

    def to_dict(self) -> dict:
        return asdict(self)


@dataclass
class ExtractResult:
    """ผลของ connector หนึ่งตัว — orders + inventory + สถานะ (เพื่อ partial-failure handling)."""
    platform: str
    orders: list = field(default_factory=list)        # list[OrderRecord]
    inventory: list = field(default_factory=list)      # list[InventoryRecord]
    ok: bool = True
    source: str = "api"                                 # api | playwright | sample
    error: str = ""

    def summary(self) -> dict:
        return {
            "platform": self.platform,
            "orders": len(self.orders),
            "inventory": len(self.inventory),
            "ok": self.ok,
            "source": self.source,
            "error": self.error,
        }
