#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Nom du script  : prepare_svg_analyses.py
Chemin         : /var/www/html/analyses/prepare_svg_analyses.py
Description    :
    Nettoie le SVG exporté depuis QGIS pour le projet "analyses" et :
      - supprime les <rect> de fond,
      - enlève les styles inline (fill, stroke, style, etc.),
      - garantit id="carte-analyses" sur <svg>,
      - numérote les géométries des groupes #zones et #sites :
            zone-1, zone-2, ...
            site-1, site-2, ...
Auteur        : Sylvain SCATTOLINI
Date          : 2025-11-27
Version       : 1.1
"""

import sys
from lxml import etree

SVG_INPUT = "carte_analyses_original.svg"
SVG_OUTPUT = "carte_analyses_final.svg"

NS = {"svg": "http://www.w3.org/2000/svg"}


def remove_rectangles(root: etree._Element) -> None:
    rects = root.findall(".//svg:rect", namespaces=NS)
    print(f"[INFO] Rectangles trouvés : {len(rects)} (suppression)")
    for r in rects:
        parent = r.getparent()
        if parent is not None:
            parent.remove(r)


def remove_inline_styles(root: etree._Element) -> None:
    count = 0
    for elem in root.xpath(".//*"):
        modified = False
        for attr in (
            "style",
            "fill",
            "stroke",
            "stroke-width",
            "opacity",
            "fill-opacity",
            "stroke-linecap",
            "stroke-linejoin",
        ):
            if attr in elem.attrib:
                del elem.attrib[attr]
                modified = True
        if modified:
            count += 1
    print(f"[INFO] Éléments nettoyés de styles inline : {count}")


def ensure_svg_id(root: etree._Element, svg_id: str = "carte-analyses") -> None:
    root.attrib["id"] = svg_id
    print(f"[INFO] id du <svg> fixé à '{svg_id}'")


def assign_ids_to_group_paths(root: etree._Element, group_id: str, prefix: str) -> int:
    groups = root.findall(f".//svg:g[@id='{group_id}']", namespaces=NS)
    if not groups:
        print(f"[AVERTISSEMENT] Aucun groupe id='{group_id}' trouvé")
        return 0

    assigned = 0
    for g in groups:
        elems = []
        elems.extend(g.findall(".//svg:path", namespaces=NS))
        elems.extend(g.findall(".//svg:polygon", namespaces=NS))
        elems.extend(g.findall(".//svg:polyline", namespaces=NS))

        print(f"[INFO] Groupe '{group_id}' : {len(elems)} géométrie(s) à numéroter")

        for elem in elems:
            assigned += 1
            elem.attrib["id"] = f"{prefix}-{assigned}"

    print(f"[INFO] IDs assignés pour '{group_id}' (préfixe '{prefix}-') : {assigned}")
    return assigned


def main() -> int:
    print("=== Préparation du SVG 'analyses' ===")
    print(f"[INFO] Lecture : {SVG_INPUT}")

    try:
        parser = etree.XMLParser(remove_comments=True)
        tree = etree.parse(SVG_INPUT, parser)
        root = tree.getroot()
    except Exception as exc:
        print(f"[ERREUR] Lecture SVG : {exc}", file=sys.stderr)
        return 1

    remove_rectangles(root)
    remove_inline_styles(root)
    ensure_svg_id(root)

    nb_zones = assign_ids_to_group_paths(root, "zones", "zone")
    nb_sites = assign_ids_to_group_paths(root, "sites", "site")

    print(f"[INFO] Zones numérotées : {nb_zones}")
    print(f"[INFO] Sites numérotés : {nb_sites}")

    try:
        tree.write(SVG_OUTPUT, encoding="utf-8", pretty_print=True, xml_declaration=True)
    except Exception as exc:
        print(f"[ERREUR] Écriture SVG : {exc}", file=sys.stderr)
        return 1

    print(f"[SUCCÈS] SVG final écrit dans : {SVG_OUTPUT}")
    print("=== Terminé ===")
    return 0


if __name__ == "__main__":
    sys.exit(main())