"""Pipeline: importa un archivo .vcf completo a una coleccion CardDAV.

Compone funciones del registry: lee el .vcf del disco, lo parte en VCARDs
individuales (split_vcards), por cada tarjeta extrae o sintetiza el UID
(extract_or_make_uid) y la sube via HTTP PUT (carddav_put_vcard). Devuelve un
resumen {ok, fail, total, errors}. Impuro (I/O de disco + red). Solo stdlib.
"""

import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

from infra.split_vcards import split_vcards
from infra.extract_or_make_uid import extract_or_make_uid
from infra.carddav_put_vcard import carddav_put_vcard


def import_vcf_to_carddav(
    vcf_path: str,
    base_url: str,
    username: str,
    password: str,
    collection_path: str,
    *,
    timeout_s: float = 20.0,
    verify_tls: bool = True,
    uid_prefix: str = "goog-",
) -> dict:
    """Importa todas las tarjetas de un .vcf a una coleccion CardDAV.

    Args:
        vcf_path: ruta en disco del archivo .vcf a importar.
        base_url: URL base del servidor DAV.
        username: usuario para HTTP Basic auth.
        password: contrasena para HTTP Basic auth.
        collection_path: ruta de la coleccion CardDAV destino.
        timeout_s: timeout por PUT en segundos. Default 20.0.
        verify_tls: si True (default) verifica el certificado TLS.
        uid_prefix: prefijo del UID sintetico cuando una tarjeta no trae UID.

    Returns:
        dict: {ok:int, fail:int, total:int, errors:[{uid:str, error:str}, ...]}.
        ok = tarjetas subidas con exito; fail = tarjetas que fallaron; total =
        tarjetas encontradas en el .vcf.
    """
    with open(vcf_path, "r", encoding="utf-8", errors="replace") as fh:
        data = fh.read()

    cards = split_vcards(data)
    ok = 0
    fail = 0
    errors = []
    for card in cards:
        uid = extract_or_make_uid(card, prefix=uid_prefix)
        # Si la tarjeta no declaraba UID, inyectarlo antes del END:VCARD para que
        # el campo UID: y el nombre del recurso queden consistentes.
        if "UID:" not in card:
            card = card.replace("END:VCARD", "UID:%s\r\nEND:VCARD" % uid)
        res = carddav_put_vcard(
            base_url, username, password, collection_path, uid, card,
            timeout_s=timeout_s, verify_tls=verify_tls,
        )
        if res.get("status") == "ok":
            ok += 1
        else:
            fail += 1
            errors.append({"uid": uid, "error": res.get("error", "unknown")})

    return {"ok": ok, "fail": fail, "total": len(cards), "errors": errors}


if __name__ == "__main__":
    import json

    if len(sys.argv) < 6:
        print(
            "uso: import_vcf_to_carddav.py <vcf_path> <base_url> <username> "
            "<password> <collection_path>",
            file=sys.stderr,
        )
        sys.exit(2)
    summary = import_vcf_to_carddav(
        sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5]
    )
    # No imprimir errores con datos sensibles; solo conteos + uids.
    print(json.dumps({k: summary[k] for k in ("ok", "fail", "total")}))
