#!/usr/bin/env python3
import json
import pathlib
import time

import requests

ROOT = pathlib.Path(__file__).resolve().parents[1]
API_DIR = ROOT / "api"
OLD_DATA = ROOT.parent / "20260622-full-retest" / "data"
BASE = "http://8.147.119.215:8080"
SESSION = requests.Session()
SESSION.trust_env = False


def post(path, data=None, token=None, timeout=30):
    headers = {}
    if token:
        headers["token"] = token
    started = time.time()
    try:
        resp = SESSION.post(BASE + path, data=data or {}, headers=headers, timeout=timeout)
        elapsed = time.time() - started
        try:
            body = resp.json()
        except Exception:
            body = {"raw": resp.text[:1000]}
        return {"status": resp.status_code, "elapsed": elapsed, "body": body}
    except Exception as exc:
        return {"status": 0, "elapsed": time.time() - started, "body": {"code": 1, "message": repr(exc)}}


def load_tsv(path):
    rows = []
    with open(path, encoding="utf-8") as f:
        for line in f:
            line = line.rstrip("\n")
            if line:
                rows.append(line.split("\t"))
    return rows


def login_token():
    body = post("/p/login/login", {"account": "admin", "pwd": "Cpt@1234"})["body"]
    token = body["data"]["_token"]
    (API_DIR / "70-login-for-mqtt-push-dishes.json").write_text(json.dumps(body, ensure_ascii=False, indent=2))
    return token


def equipment_map(token):
    res = post("/p/equipment/lists", {"type": 10, "page": 1, "pageSize": 100}, token=token)
    rows = res["body"]["data"]["rows"]
    selected = {row["code"]: row for row in rows if str(row.get("code", "")).startswith("CSFZX460")}
    (API_DIR / "71-equipment-460-list-for-mqtt-push-dishes.json").write_text(json.dumps(res, ensure_ascii=False, indent=2))
    return selected


def main():
    token = login_token()
    equipments = equipment_map(token)
    dishes = load_tsv(OLD_DATA / "csfzx_load_dishes_60.tsv")
    results = []
    for idx in range(60):
        code = f"CSFZX460{idx + 1:03d}"
        equipment = equipments[code]
        dish = dishes[idx]
        heartbeat = post("/p/api/heartbeat", {"code": code})
        res = post(
            "/p/equipment/pushDishes",
            {
                "equipment_id": equipment["id"],
                "left_dishes_uuid": dish[0],
                "right_dishes_uuid": "",
            },
            token=token,
        )
        results.append(
            {
                "code": code,
                "equipment_id": equipment["id"],
                "dish_uuid": dish[0],
                "dish_name": dish[1],
                "heartbeat": heartbeat,
                "push": res,
                "ok": (
                    heartbeat["status"] == 200
                    and heartbeat["body"].get("code") == 0
                    and res["status"] == 200
                    and res["body"].get("code") == 0
                ),
            }
        )
    summary = {
        "total": len(results),
        "ok": sum(1 for row in results if row["ok"]),
        "fail": sum(1 for row in results if not row["ok"]),
        "results": results,
    }
    (API_DIR / "72-mqtt-rerun-push-dishes-60-response.json").write_text(json.dumps(summary, ensure_ascii=False, indent=2))
    print(json.dumps({k: v for k, v in summary.items() if k != "results"}, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
