#!/usr/bin/env python3
"""Compara verify_mine.csv (mi scanner) vs iscout_ref.txt (iScout)."""
import os, csv, re

HERE = os.path.dirname(os.path.abspath(__file__))

def fam(name):
    n = name.lower()
    if "cerberus" in n: return "Cerberus"
    if "bayard" in n or "bayar" in n: return "Bayard"
    if "lava turtle" in n: return "LavaTurtle"
    return None

# iScout ref: "X Y Name... Lv1"
ref = []
for ln in open(os.path.join(HERE, "iscout_ref.txt")):
    ln = ln.strip()
    if not ln: continue
    m = re.match(r"(\d+)\s+(\d+)\s+(.+?)\s+Lv(\d+)", ln)
    if not m: continue
    x, y, nm, lv = int(m.group(1)), int(m.group(2)), m.group(3).strip(), int(m.group(4))
    ref.append((x, y, fam(nm), nm))
ref_fam = [r for r in ref if r[2]]
print(f"iScout: {len(ref)} entradas ({len(ref_fam)} en familias Cerberus/Bayard/LavaTurtle)")

# Mine
mine = []
with open(os.path.join(HERE, "verify_mine.csv")) as f:
    for r in csv.DictReader(f):
        x, y = int(r["x"]), int(r["y"])
        mine.append((x, y, fam(r["name"]), r["name"], r["level"]))
mine_fam = [m for m in mine if m[2]]
print(f"Mio: {len(mine)} objetos totales ({len(mine_fam)} en esas 3 familias)")

# index mio por (x,y) y por familia con tolerancia
mine_xy = {}
for x, y, fm, nm, lv in mine:
    mine_xy.setdefault((x, y), []).append((fm, nm))

def found(rx, ry, rfam, tol=2):
    for dx in range(-tol, tol+1):
        for dy in range(-tol, tol+1):
            for fm, nm in mine_xy.get((rx+dx, ry+dy), []):
                if fm == rfam:
                    return True, (dx, dy)
    return False, None

hit = miss = 0
miss_in_range = []
miss_out_range = []
for x, y, fm, nm in ref_fam:
    ok, off = found(x, y, fm)
    if ok:
        hit += 1
    else:
        miss += 1
        # mi cobertura fue 0..1023 (clamp); fuera de eso no podia verlo
        if x > 1023 or y > 1023:
            miss_out_range.append((x, y, nm))
        else:
            miss_in_range.append((x, y, nm))

print(f"\n=== RESULTADO (match con tolerancia +-2 tiles) ===")
print(f"iScout en familias: {len(ref_fam)}")
print(f"  Encontrados por mi: {hit}  ({round(100*hit/len(ref_fam))}%)")
print(f"  No encontrados: {miss}")
print(f"   - fuera de mi rango (x o y >1023, clamp): {len(miss_out_range)}")
for x, y, nm in miss_out_range: print(f"       {x},{y} {nm}")
print(f"   - DENTRO de rango (fallo real): {len(miss_in_range)}")
for x, y, nm in miss_in_range: print(f"       {x},{y} {nm}")

# ajustado: % sobre los que SI estaban en mi rango
in_range_total = len([r for r in ref_fam if r[0] <= 1023 and r[1] <= 1023])
print(f"\nPrecision dentro de mi rango (0-1023): {hit}/{in_range_total} = {round(100*hit/in_range_total)}%")
print(f"\nMis totales por familia: " +
      ", ".join(f"{k}={sum(1 for m in mine_fam if m[2]==k)}" for k in ['Cerberus','Bayard','LavaTurtle']))
