#!/usr/bin/env python3
"""Genera embedding CLIP de una etiqueta y lo guarda en label_embeddings."""

from __future__ import annotations

import json
import os
import sys
from pathlib import Path
from urllib.parse import quote_plus

import numpy as np
from dotenv import load_dotenv

ROOT = Path(__file__).resolve().parents[1]

# Credenciales MySQL desde el .env de la raíz del repo (antes de importar el backend).
ENV_PATH = ROOT / ".env"
if not ENV_PATH.is_file():
    raise SystemExit(f"No se encontró {ENV_PATH}")
load_dotenv(ENV_PATH, override=True)

if not os.getenv("DATABASE_URL"):
    user = os.getenv("MYSQL_USER", "bottle")
    password = quote_plus(os.getenv("MYSQL_PASSWORD", ""))
    database = os.getenv("MYSQL_DATABASE", "bottle_ai")
    host = os.getenv("MYSQL_HOST", "localhost")
    port = os.getenv("MYSQL_PORT", "3306")
    os.environ["DATABASE_URL"] = (
        f"mysql+pymysql://{user}:{password}@{host}:{port}/{database}"
    )

sys.path.insert(0, str(ROOT / "backend"))

from sqlalchemy import create_engine  # noqa: E402
from sqlalchemy.orm import sessionmaker  # noqa: E402

from app.core.config import get_settings  # noqa: E402
from app.core.database import Base  # noqa: E402
from app.models.label_embedding import LabelEmbedding  # noqa: E402
from app.models.product import Product  # noqa: E402
from app.services.clip_embedding import embed_image_path  # noqa: E402

get_settings.cache_clear()
settings = get_settings()
engine = create_engine(
    settings.database_url,
    pool_pre_ping=True,
    pool_recycle=3600,
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

PRODUCT_ID = "coca_001"
DEFAULT_IMAGE = Path(
    "/var/www/html/etiquetas-ia/etiquetas/botellas/coca_zero_2.25L.jpeg"
)


def get_image_embedding(image_path: Path) -> np.ndarray:
    return embed_image_path(str(image_path), model_name=settings.clip_model_name)


def save_embedding(id_product: str, vector: np.ndarray) -> tuple[LabelEmbedding, str]:
    Base.metadata.create_all(bind=engine)
    db = SessionLocal()
    try:
        product = db.get(Product, id_product)
        if not product:
            raise SystemExit(
                f"No existe el producto id={id_product!r}. "
                "Creá el producto antes de guardar el embedding."
            )

        flat = vector.reshape(-1).astype(float).tolist()
        row = LabelEmbedding(id_product=id_product, embedding=flat)
        db.add(row)
        db.commit()
        db.refresh(row)
        db_target = settings.database_url.split("@")[-1]
        return row, db_target
    finally:
        db.close()


def main() -> None:
    image_path = Path(sys.argv[1]) if len(sys.argv) > 1 else DEFAULT_IMAGE
    image_path = Path(image_path)
    if not image_path.is_file():
        raise SystemExit(f"No se encontró la imagen: {image_path}")

    embedding = get_image_embedding(image_path)
    row, db_target = save_embedding(PRODUCT_ID, embedding)

    print(
        json.dumps(
            {
                "ok": True,
                "id": row.id,
                "id_product": row.id_product,
                "dims": len(row.embedding),
                "image": str(image_path),
                "database": db_target,
                "env_file": str(ENV_PATH),
            },
            indent=2,
        )
    )


if __name__ == "__main__":
    main()
