"""
Busca TODAS las entidades en color rojo (o la capa indicada), incluyendo
tipos que pueden producir relleno: HATCH, SOLID, CIRCLE, ARC, ELLIPSE,
LWPOLYLINE/POLYLINE cerradas, SPLINE, etc.

Uso:
    python check2.py plano.dxf --color 1
    python check2.py plano.dxf --layer NOMBRE_CAPA
"""

import argparse
import ezdxf


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("dxf_file")
    parser.add_argument("--layer", default=None)
    parser.add_argument("--color", type=int, default=None)
    args = parser.parse_args()

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

    def matches(e):
        if args.layer and e.dxf.layer != args.layer:
            return False
        if args.color is not None:
            try:
                if e.dxf.color != args.color:
                    return False
            except Exception:
                return False
        return True

    print("=" * 70)
    print("Buscando TODAS las entidades (incluyendo HATCH, CIRCLE, SOLID, etc.)")
    print("=" * 70)

    count = 0
    for e in msp:
        if not matches(e):
            continue
        count += 1
        t = e.dxftype()
        print("-" * 60)
        print(f"Tipo: {t} | handle={e.dxf.handle} | capa={e.dxf.layer}")
        try:
            print(f"  color={e.dxf.color}")
        except Exception:
            pass

        if t == "HATCH":
            print(f"  ¡¡HATCH ENCONTRADO!! solid_fill={e.dxf.solid_fill} "
                  f"pattern_name={getattr(e.dxf, 'pattern_name', '?')}")
            print(f"  Número de paths/bordes: {len(e.paths)}")
            for i, p in enumerate(e.paths):
                print(f"    path[{i}] tipo={type(p).__name__}")

        elif t == "SOLID":
            print(f"  ¡¡SOLID ENCONTRADO!! (relleno triangular/cuadrado)")
            print(f"  Puntos: {e.dxf.vtx0}, {e.dxf.vtx1}, {e.dxf.vtx2}, {e.dxf.vtx3}")

        elif t == "CIRCLE":
            print(f"  CIRCLE centro={e.dxf.center} radio={e.dxf.radius}")
            print(f"  -> Si tienes 2 CIRCLE con radio grande superpuestos, son "
                  f"el origen de los blobs rojos.")

        elif t == "ARC":
            print(f"  ARC centro={e.dxf.center} radio={e.dxf.radius} "
                  f"start={e.dxf.start_angle} end={e.dxf.end_angle}")

        elif t in ("LWPOLYLINE", "POLYLINE"):
            closed = getattr(e, "closed", None)
            print(f"  closed={closed}")
            const_w = getattr(e.dxf, "const_width", None)
            print(f"  const_width={const_w}")

        elif t == "ELLIPSE":
            print(f"  ELLIPSE centro={e.dxf.center} mayor_axis={e.dxf.major_axis} "
                  f"ratio={e.dxf.ratio}")

        elif t == "SPLINE":
            print(f"  SPLINE con {len(e.control_points)} puntos de control")

        elif t == "INSERT":
            print(f"  INSERT (bloque) nombre={e.dxf.name} pos={e.dxf.insert}")
            print(f"  -> revisa dentro del bloque '{e.dxf.name}', puede contener "
                  f"el HATCH/CIRCLE rojo")

    print("-" * 60)
    print(f"\nTotal entidades encontradas: {count}")

    # Además: comprobar bloques por si el rojo está dentro de un INSERT
    print("\n--- Revisando definiciones de bloques (por si el relleno está dentro) ---")
    for block in doc.blocks:
        if block.name.startswith("*"):
            continue
        for e in block:
            try:
                col = e.dxf.color
            except Exception:
                continue
            if args.color is not None and col == args.color:
                print(f"  Bloque '{block.name}' contiene {e.dxftype()} "
                      f"handle={e.dxf.handle} color={col}")


if __name__ == "__main__":
    main()
