"""Tests offline para comfyui_score_aesthetic (impura: scoring LAION-V2 via subproceso torch).

Sin GPU, sin torch, sin servidor: ejercita SOLO los guards previos al subproceso (imagen,
python del venv ComfyUI y .pth del modelo ausentes), que cortan antes de tocar la GPU.
"""

import os
import sys

import pytest

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

from ml.comfyui_score_aesthetic import comfyui_score_aesthetic

PIL = pytest.importorskip("PIL")
from PIL import Image  # noqa: E402


def _png(path):
    Image.new("RGB", (8, 8), (0, 0, 0)).save(path)
    return str(path)


def test_error_imagen_inexistente(tmp_path):
    res = comfyui_score_aesthetic(str(tmp_path / "no.png"))
    assert res["ok"] is False and res["score_0_10"] == 0.0
    assert "imagen no encontrada" in res["error"]


def test_error_venv_python_inexistente(tmp_path):
    # imagen valida pero venv_python ausente -> corta antes del subproceso.
    res = comfyui_score_aesthetic(_png(tmp_path / "i.png"),
                                  venv_python=str(tmp_path / "no_python"))
    assert res["ok"] is False and "python del venv ComfyUI no encontrado" in res["error"]


def test_error_modelo_inexistente(tmp_path):
    # imagen + python validos, .pth ausente -> error de modelo, sin lanzar el subproceso.
    res = comfyui_score_aesthetic(_png(tmp_path / "i.png"),
                                  venv_python=sys.executable,
                                  model_path=str(tmp_path / "no.pth"))
    assert res["ok"] is False and "modelo estetico no encontrado" in res["error"]


def test_nunca_lanza_y_es_determinista(tmp_path):
    img = _png(tmp_path / "i.png")
    a = comfyui_score_aesthetic(img, venv_python=str(tmp_path / "x"))
    b = comfyui_score_aesthetic(img, venv_python=str(tmp_path / "x"))
    assert a == b and a["ok"] is False
