"""
Cloud Run entrypoint — Premium ETL orchestrator (เฟส 3)
=======================================================
มัดเฟส 1 (ingestion) + เฟส 2 (warehouse load) เข้าด้วยกันเป็นบริการเดียวบน Cloud Run
ถูกเรียกโดย Cloud Scheduler ทุก 4 ชม. ผ่าน HTTP (functions-framework target=run)

resilience: แพลตฟอร์มเดียวล้ม -> ทั้ง run ยังเดินต่อ + คืน HTTP 207 (Partial) + แจ้ง Telegram
            ทุก secret มาจาก Secret Manager (ตั้งผ่าน env ตอน deploy) ไม่ hardcode

หมายเหตุ: ในคอนเทนเนอร์ ไฟล์ของเฟส 1/2/3 ถูก bundle รวมกัน (ดู Dockerfile) จึง import ตรง ๆ ได้
"""
from __future__ import annotations

import json
import logging
import datetime as dt

from extract_all import run_ingestion          # เฟส 1: extract + normalize
from loader import load                          # เฟส 2: quality gate + idempotent UPSERT
from utils_telegram import notify

logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
log = logging.getLogger("etl-orchestrator")


def run(request=None):
    """HTTP entry. คืน (body, status): 200 = ครบทุกแพลตฟอร์ม, 207 = บางแพลตฟอร์มล้ม."""
    started = dt.datetime.utcnow()

    # 1) Ingestion (เฟส 1) — partial failure ถูกจับใน orchestrator ของเฟส 1 แล้ว
    payload = run_ingestion()
    meta = payload.get("_meta", {})
    errors = list(meta.get("errors", []))

    # 2) Warehouse load (เฟส 2) — quality gate + UPSERT (idempotent)
    load_summary = {}
    if payload.get("orders") or payload.get("inventory"):
        load_summary = load(payload)

    # 3) แจ้งเตือน
    ok = meta.get("platforms_ok", 0) == meta.get("platforms_total", 0) and not errors
    if errors:
        notify("🛠️ <b>ETL partial</b> — บางแพลตฟอร์มล้ม\n" + "\n".join(errors[:10]))
    else:
        notify(_daily_summary(load_summary, meta))

    dur = (dt.datetime.utcnow() - started).total_seconds()
    body = {
        "ts": started.isoformat(),
        "ingested": {k: meta.get(k) for k in ("platforms_ok", "platforms_total", "orders", "inventory")},
        "loaded": load_summary,
        "errors": errors,
        "secs": round(dur, 1),
    }
    status = 200 if ok else 207                  # 207 Multi-Status = partial success
    log.info("ETL run complete status=%s %s", status, body)
    return (json.dumps(body, ensure_ascii=False), status, {"Content-Type": "application/json"})


def _daily_summary(load_summary: dict, meta: dict) -> str:
    return (
        "✅ <b>สรุป ETL วันนี้</b>\n"
        f"• แพลตฟอร์ม: {meta.get('platforms_ok')}/{meta.get('platforms_total')}\n"
        f"• orders เข้าคลัง: {load_summary.get('orders_loaded', 0)}\n"
        f"• inventory: {load_summary.get('inventory_loaded', 0)}\n"
        f"• reject (quality): {load_summary.get('rejected', 0)}\n"
        "ดู Dashboard: &lt;Looker URL&gt;"
    )


if __name__ == "__main__":
    print(run())
