"""
Crée les propriétés Dataroia dans un portail HubSpot — à lancer UNE FOIS.

⚠️ À exécuter par le CLIENT, sur son poste, avec SON token private-app.
Dataroia ne stocke aucun token : ce script est fourni clé en main, le token
n'est lu que depuis l'environnement local du client le temps de l'exécution.

Pré-requis : une private app HubSpot avec le scope `crm.schemas.companies.write`
(et `crm.schemas.contacts.write` pour les propriétés de vérification décès).

Usage :
    export HUBSPOT_TOKEN=pat-eu1-xxxxxxxx
    python create_properties_hubspot.py                              # sociétés (enrichissement)
    python create_properties_hubspot.py properties_deces_hubspot.json # contacts (décès)

Le type d'objet (companies / contacts) est déduit du champ `objectType` du JSON.
"""
import json
import os
import sys
import urllib.error
import urllib.request
from pathlib import Path

API_TMPL = "https://api.hubapi.com/crm/v3/properties/{objectType}"


def main() -> int:
    token = os.environ.get("HUBSPOT_TOKEN")
    if not token:
        print("Définis HUBSPOT_TOKEN (token private-app) avant de lancer.", file=sys.stderr)
        return 2

    defs_name = sys.argv[1] if len(sys.argv) > 1 else "properties_hubspot.json"
    defs = Path(defs_name) if Path(defs_name).is_absolute() else Path(__file__).with_name(defs_name)
    spec = json.loads(defs.read_text(encoding="utf-8"))
    api = API_TMPL.format(objectType=spec.get("objectType", "companies"))
    group = spec["groupName"]
    print(f"Objet : {spec.get('objectType', 'companies')} — {len(spec['properties'])} propriété(s)")
    headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}

    created, skipped, failed = 0, 0, 0
    for prop in spec["properties"]:
        body = {
            "name": prop["name"],
            "label": prop["label"],
            "type": prop["type"],
            "fieldType": prop["fieldType"],
            "groupName": group,
        }
        if "options" in prop:
            body["options"] = [
                {"label": o["label"], "value": o["value"], "displayOrder": i}
                for i, o in enumerate(prop["options"])
            ]

        req = urllib.request.Request(
            api, data=json.dumps(body).encode(), headers=headers, method="POST"
        )
        try:
            urllib.request.urlopen(req, timeout=15)
            print(f"  ✓ créée   {prop['name']}")
            created += 1
        except urllib.error.HTTPError as e:
            detail = e.read().decode(errors="replace")
            if e.code == 409 or "already exists" in detail.lower():
                print(f"  = existe  {prop['name']}")
                skipped += 1
            else:
                print(f"  ✗ échec   {prop['name']} — {e.code} {detail[:120]}", file=sys.stderr)
                failed += 1

    print(f"\nTerminé : {created} créée(s), {skipped} déjà présente(s), {failed} échec(s).")
    return 1 if failed else 0


if __name__ == "__main__":
    raise SystemExit(main())
