#!/usr/bin/env python3
import argparse
import json
import os
import sys
from pathlib import Path

import requests


def auth(base, email, password):
    base = base.rstrip("/")
    response = requests.post(
        base + "/api/collections/_superusers/auth-with-password",
        json={"identity": email, "password": password},
        timeout=30,
    )
    response.raise_for_status()
    return base, {"Authorization": "Bearer " + response.json()["token"]}


def all_records(base, headers, collection):
    items = []
    page = 1
    while True:
        response = requests.get(base + f"/api/collections/{collection}/records", headers=headers, params={"page": page, "perPage": 200}, timeout=30)
        response.raise_for_status()
        data = response.json()
        items.extend(data.get("items", []))
        if page >= data.get("totalPages", 1):
            break
        page += 1
    return items


def create_record(base, headers, collection, payload):
    response = requests.post(base + f"/api/collections/{collection}/records", headers=headers, json=payload, timeout=30)
    if response.status_code >= 300:
        raise RuntimeError(f"create {collection}: {response.status_code} {response.text[:400]}")
    return response.json()


def update_record(base, headers, collection, record_id, payload):
    response = requests.patch(base + f"/api/collections/{collection}/records/{record_id}", headers=headers, json=payload, timeout=30)
    if response.status_code >= 300:
        raise RuntimeError(f"update {collection}/{record_id}: {response.status_code} {response.text[:400]}")
    return response.json()


def clean_ref(value):
    if value is None:
        return ""
    text = str(value).strip()
    if text.endswith(".0"):
        text = text[:-2]
    return text


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--products-json", required=True)
    parser.add_argument("--apply", action="store_true")
    args = parser.parse_args()

    rows = json.loads(Path(args.products_json).read_text(encoding="utf-8"))
    base, headers = auth(os.environ["PB_URL"], os.environ["PB_ADMIN_EMAIL"], os.environ["PB_ADMIN_PASSWORD"])
    existing = all_records(base, headers, "productos")
    by_ref = {item.get("referencia_interna"): item for item in existing if item.get("referencia_interna")}
    by_name = {item.get("nombre"): item for item in existing if item.get("nombre")}

    products = []
    for row in rows:
        name = str(row.get("Nombre") or "").strip()
        if not name:
            continue
        products.append({
            "nombre": name,
            "referencia_interna": clean_ref(row.get("Referencia interna")),
            "categoria": str(row.get("Categoría del producto") or "").strip(),
            "precio_venta": float(row.get("Precio de venta") or 0),
            "cantidad_mano": float(row.get("Cantidad a la mano") or 0),
            "moneda": str(row.get("Moneda") or "ARS").strip() or "ARS",
            "favorito": bool(row.get("Favorito")),
            "activo": True,
            "source_ref": clean_ref(row.get("Referencia interna")) or name,
        })

    print(json.dumps({
        "source_rows": len(rows),
        "products_to_upsert": len(products),
        "existing": len(existing),
    }, ensure_ascii=False, indent=2))
    if not args.apply:
        print("DRY RUN: add --apply to import.")
        return

    created = updated = 0
    for product in products:
        match = by_ref.get(product["referencia_interna"]) if product["referencia_interna"] else None
        match = match or by_name.get(product["nombre"])
        if match:
            updated += 1
            saved = update_record(base, headers, "productos", match["id"], product)
        else:
            created += 1
            saved = create_record(base, headers, "productos", product)
        if product["referencia_interna"]:
            by_ref[product["referencia_interna"]] = saved
        by_name[product["nombre"]] = saved

    print(json.dumps({"created": created, "updated": updated, "final": len(all_records(base, headers, "productos"))}, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    try:
        main()
    except Exception as exc:
        print(f"FATAL: {exc}", file=sys.stderr)
        sys.exit(1)
