#!/usr/bin/env python3
"""So sanh HAI ban du bao cua CUNG mot lan khoi tao, hai goi tham so khac nhau.

Muc dich: doi chieu goi nghiep vu PA1/OPE1 voi goi Ope1b (tron 50/50) tren cung
init, cung duong thoi gian thuc.  Vi tang 1 (cong) VA nguong tung o luoi la CHUNG
cho hai goi, moi khac biet quan sat duoc deu den tu trong so tang 2.
"""
from __future__ import annotations

import argparse
import os
import sys

import numpy as np
from netCDF4 import Dataset

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import ehd_common as C

REG_ORDER = [(1, "S1 Tay Bac"), (2, "S2 Dong Bac"), (3, "S3 DB Bac Bo"),
             (4, "S4 Bac Trung Bo"), (5, "S5 Nam Trung Bo"), (6, "S6 Tay Nguyen"),
             (7, "S7 Nam Bo")]
P_REGION = 0.20          # EXP1: vung co EHDE neu > 20% o luoi


def read(path, w):
    with Dataset(path) as ds:
        k = w.replace("-", "_")
        return {n: np.asarray(ds["%s_%s" % (n, k)][:])[0]
                for n in ("prob", "pred", "p_gate", "sev_ai")}


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--a", required=True, help="ban A (chuan doi chieu)")
    ap.add_argument("--b", required=True, help="ban B")
    ap.add_argument("--name-a", default="A")
    ap.add_argument("--name-b", default="B")
    ap.add_argument("--windows", nargs="*",
                    default=["W1", "W2", "W3", "W4", "W5", "W6"])
    args = ap.parse_args()

    grid = C.Grid()
    reg = grid.reg
    na, nb = args.name_a, args.name_b

    print("=" * 78)
    print("A = %-28s %s" % (na, args.a))
    print("B = %-28s %s" % (nb, args.b))
    print("=" * 78)

    print("\n1. TOAN QUOC: so o luoi bao co EHDE / 541, va xac suat trung binh")
    print("   %-4s %8s %8s %7s | %8s %8s %8s | %s"
          % ("W", "n_" + na[:6], "n_" + nb[:6], "lech", "p_" + na[:6],
             "p_" + nb[:6], "|dp|max", "so o doi quyet dinh"))
    keep = {}
    for w in args.windows:
        a, b = read(args.a, w), read(args.b, w)
        keep[w] = (a, b)
        flip = a["pred"] != b["pred"]
        dp = np.abs(a["prob"] - b["prob"])
        print("   %-4s %8d %8d %+7d | %8.4f %8.4f %8.4f | %d (%.1f%%)"
              % (w, int(a["pred"].sum()), int(b["pred"].sum()),
                 int(b["pred"].sum()) - int(a["pred"].sum()),
                 a["prob"].mean(), b["prob"].mean(), dp.max(),
                 int(flip.sum()), 100.0 * flip.mean()))

    print("\n2. KIEM TRA CONG TANG 1 (phai TRUNG KHIT: hai goi dung chung tang 1)")
    for w in args.windows:
        a, b = keep[w]
        same = np.array_equal(a["p_gate"], b["p_gate"])
        print("   %-4s p_gate trung khit: %s   | sev_ai trung khit: %s"
              % (w, "CO" if same else "KHONG (!)",
                 "CO" if np.array_equal(a["sev_ai"], b["sev_ai"]) else "KHONG (!)"))

    print("\n3. THEO VUNG: ty le o luoi bao co EHDE (EXP1, nguong %.0f%%)"
          % (100 * P_REGION))
    for w in args.windows:
        a, b = keep[w]
        row = []
        for c, nmr in REG_ORDER:
            m = reg == c
            pa, pb = a["pred"][m].mean(), b["pred"][m].mean()
            fa = "Y" if pa > P_REGION else "n"
            fb = "Y" if pb > P_REGION else "n"
            mark = "  " if fa == fb else " *"
            row.append("%s %3.0f%%/%3.0f%%%s%s" % (nmr.split()[0], 100 * pa,
                                                   100 * pb, fa + fb, mark))
        print("   %-4s %s" % (w, " | ".join(row)))
    print("\n   (dinh dang: Sx  A%/B%  co-EHDE-A co-EHDE-B ; * = hai goi ket luan"
          "\n    KHAC NHAU o cap VUNG)")

    print("\n4. KHAC BIET XAC SUAT theo vung (trung binh b - a, don vi diem %)")
    hdr = "   %-4s" % "W" + "".join("%9s" % n.split()[0] for n, _ in
                                    [(x[1], x[0]) for x in REG_ORDER])
    print(hdr)
    for w in args.windows:
        a, b = keep[w]
        print("   %-4s" % w + "".join(
            "%+9.2f" % (100 * (b["prob"][reg == c] - a["prob"][reg == c]).mean())
            for c, _ in REG_ORDER))


if __name__ == "__main__":
    main()
