"""
Local dry-run — พิสูจน์ orchestration เฟส 3 (ก่อน deploy จริงขึ้น Cloud Run)
==========================================================================
รันทั้ง pipeline ในเครื่อง: เฟส 1 (SAMPLE) -> quality gate (เฟส 2) -> sqlite load
แล้วพิสูจน์ "สถานะ HTTP" ของ orchestrator:
  - ครบทุกแพลตฟอร์ม            -> 200
  - แพลตฟอร์มเดียวล้ม (จำลอง)  -> 207 (Partial) แต่ตัวอื่นยังโหลดได้

รัน:  python orchestrate_dryrun.py
(ตรรกะเดียวกับ main.py — ต่างที่ใช้ sqlite แทน Postgres เพื่อรันได้โดยไม่ต้องมี cloud)
"""
from __future__ import annotations

import os
import sys
import sqlite3

HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(HERE, "..", "phase1"))
sys.path.insert(0, os.path.join(HERE, "..", "phase2"))
os.environ.setdefault("SAMPLE_MODE", "1")          # ให้เฟส 1 คืนข้อมูลตัวอย่าง

from extract_all import run_ingestion               # noqa: E402  (เฟส 1)
from quality import quality_gate                    # noqa: E402  (เฟส 2)

DDL = """
CREATE TABLE IF NOT EXISTS orders (platform TEXT, platform_order_id TEXT, order_date TEXT,
  total_amount REAL, status TEXT, sku TEXT, qty INTEGER, unit_price REAL,
  PRIMARY KEY (platform, platform_order_id, sku));
CREATE TABLE IF NOT EXISTS inventory (platform TEXT, sku TEXT, stock INTEGER, updated_at TEXT,
  PRIMARY KEY (platform, sku));
"""
UP_O = ("INSERT INTO orders VALUES (:platform,:platform_order_id,:order_date,:total_amount,"
        ":status,:sku,:qty,:unit_price) ON CONFLICT(platform,platform_order_id,sku) DO UPDATE SET "
        "total_amount=excluded.total_amount, qty=excluded.qty")
UP_I = ("INSERT INTO inventory VALUES (:platform,:sku,:stock,:updated_at) "
        "ON CONFLICT(platform,sku) DO UPDATE SET stock=excluded.stock")


def http_status(platforms_ok: int, platforms_total: int, errors: list) -> int:
    """ตรรกะเดียวกับ main.run(): 200 ถ้าครบ, ไม่งั้น 207 (Partial)."""
    return 200 if (platforms_ok == platforms_total and not errors) else 207


def main():
    # ---- รันจริง: เฟส 1 -> เฟส 2 quality -> sqlite load ----
    payload = run_ingestion()
    meta = payload["_meta"]
    gated = quality_gate(payload)

    conn = sqlite3.connect(":memory:")
    conn.executescript(DDL)
    conn.executemany(UP_O, gated["clean_orders"])
    conn.executemany(UP_I, gated["clean_inventory"])
    conn.commit()
    n_orders = conn.execute("SELECT COUNT(*) FROM orders").fetchone()[0]

    status_ok = http_status(meta["platforms_ok"], meta["platforms_total"], meta["errors"])

    # ---- จำลอง partial failure: 1 แพลตฟอร์มล้ม -> ต้องได้ 207 แต่ที่เหลือยังโหลด ----
    status_partial = http_status(4, 5, ["tiktok: HTTP 500 (API ล่มช่วงพีค)"])

    print("=== Orchestration dry-run (เฟส1 -> เฟส2 -> warehouse) ===")
    print(f"platforms ok : {meta['platforms_ok']}/{meta['platforms_total']}")
    print(f"orders loaded : {n_orders}  | inventory clean : {len(gated['clean_inventory'])}")
    print(f"quality reject: {gated['stats']['rejected']}")
    print(f"\nHTTP status (ทุกแพลตฟอร์มสำเร็จ)      -> {status_ok}  (200 = OK)")
    print(f"HTTP status (จำลอง tiktok ล้ม)        -> {status_partial}  (207 = Partial, ตัวอื่นยังโหลด)")
    assert status_ok == 200 and status_partial == 207, "status logic ผิด!"
    print("\n✓ orchestration + 207 partial-success logic ทำงานถูกต้อง")


if __name__ == "__main__":
    main()
