"""
Busca TODAS las entidades del modelspace (cualquier tipo, cualquier color,
incluyendo true_color RGB) cuyo bounding box caiga dentro de la región
indicada. Útil para identificar qué entidad concreta produce un blob
visual en el SVG cuando no sabemos su color exacto.

Uso:
    python check3.py plano.dxf --xmin 590 --xmax 650 --ymin -1250 --ymax -1245

Ajusta xmin/xmax/ymin/ymax a la región aproximada donde aparece el blob
rojo (puedes usar como referencia las coordenadas que ya vimos antes:
x entre 595 y 644, y entre -1246 y -1248 -- amplía un poco el margen).
"""

import argparse
import ezdxf
from ezdxf.math import BoundingBox


def get_bbox(e):
    try:
        from ezdxf import bbox as bbox_mod
        bb = bbox_mod.extents([e])
        if bb.has_data:
            return bb
    except Exception:
        pass
    return None


def describe_color(e):
    parts = []
    try:
        parts.append(f"aci_color={e.dxf.color}")
    except Exception:
        pass
    try:
        if e.dxf.hasattr("true_color"):
            tc = e.dxf.true_color
            r = (tc >> 16) & 0xFF
            g = (tc >> 8) & 0xFF
            b = tc & 0xFF
            parts.append(f"true_color=RGB({r},{g},{b})")
    except Exception:
        pass
    try:
        parts.append(f"layer={e.dxf.layer}")
    except Exception:
        pass
    return " | ".join(parts)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("dxf_file")
    parser.add_argument("--xmin", type=float, required=True)
    parser.add_argument("--xmax", type=float, required=True)
    parser.add_argument("--ymin", type=float, required=True)
    parser.add_argument("--ymax", type=float, required=True)
    args = parser.parse_args()

    doc = ezdxf.readfile(args.dxf_file)
    msp = doc.modelspace()

    region = BoundingBox([
        (args.xmin, args.ymin, 0),
        (args.xmax, args.ymax, 0),
    ])

    print("=" * 70)
    print(f"Buscando entidades en región x=[{args.xmin},{args.xmax}] "
          f"y=[{args.ymin},{args.ymax}]")
    print("=" * 70)

    count_by_type = {}
    total = 0

    for e in msp:
        bb = get_bbox(e)
        if bb is None or not bb.has_data:
            continue
        # comprobar solapamiento
#        if (bb.extmax.x < region.extmin.x or bb.extmin.x > region.extmax.x or
#                bb.extmax.y < region.extmin.y or bb.extmin.y > region.extmax.y):
#            continue

        total += 1
        t = e.dxftype()
        count_by_type[t] = count_by_type.get(t, 0) + 1

        marca = ""
        if t in ("HATCH", "SOLID", "TRACE", "3DFACE", "MESH"):
            marca = "  <<< POSIBLE RELLENO"

        print(f"{t:12s} handle={e.dxf.handle:6s} {describe_color(e)}{marca}")

        if t == "HATCH":
            print(f"    solid_fill={e.dxf.solid_fill} "
                  f"pattern_name={getattr(e.dxf, 'pattern_name', '?')} "
                  f"num_paths={len(e.paths)}")

    print("-" * 70)
    print("Resumen por tipo:")
    for t, c in sorted(count_by_type.items(), key=lambda x: -x[1]):
        print(f"  {t}: {c}")
    print(f"\nTotal entidades en la región: {total}")


if __name__ == "__main__":
    main()
