import pytest
from pydantic import ValidationError

from app.models import OEEInput
from app.oee_calculator import calculate_oee


def test_calculate_oee_standard_case() -> None:
    result = calculate_oee(
        {
            "tiempo_turno_min": 480,
            "paradas_planificadas_min": 30,
            "paradas_no_planificadas_min": 45,
            "produccion_total": 920,
            "produccion_buena": 870,
            "ciclo_ideal_seg": 25,
        }
    )

    assert result.tiempo_planificado_min == 450
    assert result.tiempo_operativo_min == 405
    assert result.disponibilidad == pytest.approx(0.9)
    assert result.rendimiento == pytest.approx(0.946502, abs=0.000001)
    assert result.calidad == pytest.approx(0.945652, abs=0.000001)
    assert result.oee == pytest.approx(0.805556, abs=0.000001)
    assert result.cuello_botella == "disponibilidad"


def test_reject_good_units_greater_than_total() -> None:
    with pytest.raises(ValidationError):
        OEEInput.model_validate(
            {
                "tiempo_turno_min": 480,
                "paradas_planificadas_min": 0,
                "paradas_no_planificadas_min": 10,
                "produccion_total": 100,
                "produccion_buena": 101,
                "ciclo_ideal_seg": 20,
            }
        )

