#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
clean_svg.py
Chemin : /var/www/html/analyses/clean_svg.py
Description :
  Nettoie un SVG exporté depuis QGIS :
   - repère les groupes correspondant aux couches zones/sites
     (par id OU inkscape:label)
   - assigne des id propres aux <path> :
       * id="zone-<id>"
       * id="site-<id>"
   - supprime les styles inline sur ces paths uniquement
   - NE SUPPRIME AUCUN PATH.

Auteur : Sylvain SCATTOLINI
Date creation : 2025-11-26
Version : 1.1
"""

import json
from lxml import etree

# -------------------------------------------------------------------
# CONFIG
# -------------------------------------------------------------------
SVG_INPUT = "carte_analyses_original.svg"
SVG_OUTPUT = "carte_analyses_clean.svg"
ZONES_JSON = "zones.geojson"
SITES_JSON = "sites.geojson"

# ⚠️ Noms EXACTS trouvés dans list_svg_layers.py
LAYER_ZONES_NAME = "Carte 1: zones"
LAYER_SITES_NAME = "Carte 1: sites"

# -------------------------------------------------------------------
# NAMESPACES SVG / INKSCAPE
# -------------------------------------------------------------------
NS = {
    "svg": "http://www.w3.org/2000/svg",
    "inkscape": "http://www.inkscape.org/namespaces/inkscape",
}

# -------------------------------------------------------------------
# Charger les IDs depuis un GeoJSON : [ "zone-1", "zone-2", ... ]
# -------------------------------------------------------------------
def load_ids(geojson_file, prefix):
    with open(geojson_file, "r", encoding="utf-8") as f:
        data = json.load(f)

    ids = []
    for feat in data.get("features", []):
        fid = feat.get("properties", {}).get("id")
        if fid is not None:
            ids.append(f"{prefix}-{fid}")
    return ids

# -------------------------------------------------------------------
# Nettoyer styles inline d'un path
# -------------------------------------------------------------------
def clean_styles(elem):
    for attr in ["style", "fill", "stroke", "stroke-width", "opacity"]:
        if attr in elem.attrib:
            del elem.attrib[attr]

# -------------------------------------------------------------------
# Trouver les groupes d'une couche
# -------------------------------------------------------------------
def find_layer_groups(root, layer_name):
    groups = []

    # Recherche par id exact
    xpath_id = f".//svg:g[@id='{layer_name}']"
    groups.extend(root.findall(xpath_id, namespaces=NS))

    # Recherche par inkscape:label exact
    xpath_label = f".//svg:g[@inkscape:label='{layer_name}']"
    groups.extend(root.findall(xpath_label, namespaces=NS))

    return groups

# -------------------------------------------------------------------
# Appliquer les IDs aux paths d'un groupe
# -------------------------------------------------------------------
def assign_ids_to_group(groups, ids, prefix):
    assigned = 0

    for g in groups:
        paths = g.findall(".//svg:path", namespaces=NS)
        print(f"[{prefix}] Groupe '{prefix}' trouvé avec {len(paths)} path(s)")

        for p, new_id in zip(paths, ids[assigned:]):
            clean_styles(p)
            p.attrib["id"] = new_id
            assigned += 1

        if assigned >= len(ids):
            break

    print(f"[{prefix}] IDs assignés : {assigned}/{len(ids)}")
    if assigned < len(ids):
        print(f"⚠️ Il reste {len(ids) - assigned} IDs non assignés (plus d'IDs que de paths).")

    return assigned

# -------------------------------------------------------------------
# MAIN
# -------------------------------------------------------------------
def main():
    parser = etree.XMLParser(remove_comments=True)
    tree = etree.parse(SVG_INPUT, parser)
    root = tree.getroot()

    zone_ids = load_ids(ZONES_JSON, "zone")
    site_ids = load_ids(SITES_JSON, "site")

    print(f"Zones à assigner : {len(zone_ids)}")
    print(f"Sites à assigner : {len(site_ids)}")

    # Trouver les groupes
    zone_groups = find_layer_groups(root, LAYER_ZONES_NAME)
    site_groups = find_layer_groups(root, LAYER_SITES_NAME)

    print(f"Groupes zones trouvés : {len(zone_groups)}")
    print(f"Groupes sites trouvés : {len(site_groups)}")

    if not zone_groups:
        print(f"⚠️ Aucun groupe '{LAYER_ZONES_NAME}' trouvé !")
    if not site_groups:
        print(f"⚠️ Aucun groupe '{LAYER_SITES_NAME}' trouvé !")

    assign_ids_to_group(zone_groups, zone_ids, "zones")
    assign_ids_to_group(site_groups, site_ids, "sites")

    tree.write(SVG_OUTPUT, encoding="utf-8", pretty_print=True, xml_declaration=True)
    print(f"✅ SVG nettoyé disponible : {SVG_OUTPUT}")

if __name__ == "__main__":
    main()