#!/usr/bin/env python3
"""
lookup_license_status.py
=========================
For every unique call sign appearing in blank_antenna_analysis.csv
(as either blank_site or other_site), looks up its License Status
(HD.dat field 6: A=Active, C=Cancelled, E=Expired, T=Terminated, etc.)
from l_micro.zip.

Usage:
    python lookup_license_status.py blank_antenna_analysis.csv --out license_status.csv
"""
import argparse
import csv
import io
import zipfile

LICENSE_STATUS_MEANINGS = {
    "A": "Active",
    "C": "Cancelled",
    "E": "Expired",
    "T": "Terminated",
    "L": "Pending Legal",
    "X": "Term Pending",
}

ap = argparse.ArgumentParser()
ap.add_argument("analysis_csv")
ap.add_argument("--out", default="license_status.csv")
ap.add_argument("--zip-cache", default="l_micro.zip")
args = ap.parse_args()

with open(args.analysis_csv, newline="") as f:
    rows = list(csv.DictReader(f))

call_signs = set()
for r in rows:
    call_signs.add(r["blank_site"].strip())
    call_signs.add(r["other_site"].strip())

print(f"{len(call_signs)} unique call sign(s) to look up.")

status = {}
with zipfile.ZipFile(args.zip_cache) as z:
    with z.open("HD.dat") as raw:
        for line in io.TextIOWrapper(raw, encoding="latin-1"):
            fields = line.rstrip("\n").split("|")
            cs = fields[4].strip() if len(fields) > 4 else ""
            if cs in call_signs:
                code = fields[5].strip() if len(fields) > 5 else ""
                status[cs] = code

found = 0
with open(args.out, "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["call_sign", "license_status_code", "license_status"])
    for cs in sorted(call_signs):
        code = status.get(cs, "")
        meaning = LICENSE_STATUS_MEANINGS.get(code, code if code else "NOT FOUND IN HD.dat")
        if cs in status:
            found += 1
        w.writerow([cs, code, meaning])

print(f"Wrote {len(call_signs)} row(s) to {args.out}; {found} found in HD.dat, "
      f"{len(call_signs) - found} not found.")
