#!/usr/bin/env python3
"""
diag_missing_antennas.py
=========================
For every path in ATT_Network.csv, checks whether main_a/main_b were
found via find_path_antennas() (the PA.dat-based exact join). For paths
where one or both are missing, categorizes why:

  - "no PA record for this pair": call signs exist in fcc_antennas.csv
    but no PA.dat row links A<->B specifically
  - "no antenna records at all": call sign doesn't appear in
    fcc_antennas.csv at all (not in AN.dat for our filtered set)
  - "PA record exists but referenced antenna missing": PA.dat links
    A<->B, but the specific (location,antenna_number) it points to
    isn't in fcc_antennas.csv

Usage:
    python diag_missing_antennas.py ATT_Network.csv
"""
import csv
import sys

from path_profile_tool import load_fcc_data, find_path_antennas

net_csv = sys.argv[1] if len(sys.argv) > 1 else "ATT_Network.csv"

with open(net_csv, newline="") as f:
    rows = [r for r in csv.DictReader(f) if r.get("Ref_ID", "").strip().isdigit()]

fcc_antennas, fcc_paths = load_fcc_data("fcc_antennas.csv", "fcc_paths.csv")

# Which call signs have ANY antenna record at all?
cs_with_antennas = {key[0] for key in fcc_antennas}

n_total = len(rows)
n_main_a_missing = 0
n_main_b_missing = 0
n_both_missing = 0
n_fully_ok = 0

categories = {"no_pa_record": [], "no_antenna_data": [], "pa_record_but_antenna_missing": []}

for row in rows:
    name_a, name_b = row["Site_A_Call_Sign"], row["Site_B_Call_Sign"]
    path_id = row["Path_ID2"]
    main_a, div_a, main_b, div_b = find_path_antennas(name_a, name_b, fcc_antennas, fcc_paths)

    a_missing = main_a is None
    b_missing = main_b is None
    if not a_missing and not b_missing:
        n_fully_ok += 1
        continue
    if a_missing:
        n_main_a_missing += 1
    if b_missing:
        n_main_b_missing += 1
    if a_missing and b_missing:
        n_both_missing += 1

    key = frozenset((name_a, name_b))
    records = fcc_paths.get(key, [])

    for side, missing, cs in ((name_a, a_missing, name_a), (name_b, b_missing, name_b)):
        if not missing:
            continue
        if not records:
            if cs not in cs_with_antennas:
                categories["no_antenna_data"].append((path_id, cs))
            else:
                categories["no_pa_record"].append((path_id, cs))
        else:
            categories["pa_record_but_antenna_missing"].append((path_id, cs))

print(f"Total paths:                {n_total}")
print(f"Fully matched (A & B main): {n_fully_ok}")
print(f"Main A missing:             {n_main_a_missing}")
print(f"Main B missing:             {n_main_b_missing}")
print(f"Both missing:               {n_both_missing}")
print()
for cat, items in categories.items():
    print(f"{cat}: {len(items)} site-side instance(s)")
    for path_id, cs in items[:10]:
        print(f"    {path_id}: {cs}")
    if len(items) > 10:
        print(f"    ... and {len(items) - 10} more")
    print()
