"""Test the Station and StationRecipeAssignment ORM models."""
import pytest
from sqlalchemy import select
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession

from src.backend.models.orm.station import Station, StationRecipeAssignment
from src.backend.tests.conftest import _create_user, create_test_recipe


async def test_create_station(db_session: AsyncSession):
    admin = await _create_user(db_session, username="admin1", is_admin=True)
    station = Station(
        code="ST-001",
        name="Linea 1",
        location="Reparto Nord",
        created_by=admin.id,
    )
    db_session.add(station)
    await db_session.flush()
    await db_session.refresh(station)
    assert station.id is not None
    assert station.active is True
    assert station.created_at is not None


async def test_station_code_is_unique(db_session: AsyncSession):
    admin = await _create_user(db_session, username="admin2", is_admin=True)
    db_session.add(Station(code="ST-DUP", name="A", created_by=admin.id))
    await db_session.flush()
    db_session.add(Station(code="ST-DUP", name="B", created_by=admin.id))
    with pytest.raises(IntegrityError):
        await db_session.flush()
    await db_session.rollback()


async def test_assign_recipe_to_station(db_session: AsyncSession):
    admin = await _create_user(db_session, username="admin3", is_admin=True)
    station = Station(code="ST-002", name="Linea 2", created_by=admin.id)
    db_session.add(station)
    await db_session.flush()
    recipe = await create_test_recipe(db_session, user_id=admin.id, code="REC-X")
    assignment = StationRecipeAssignment(
        station_id=station.id, recipe_id=recipe.id, assigned_by=admin.id,
    )
    db_session.add(assignment)
    await db_session.flush()
    result = await db_session.execute(
        select(StationRecipeAssignment).where(
            StationRecipeAssignment.station_id == station.id
        )
    )
    assignments = result.scalars().all()
    assert len(assignments) == 1
    assert assignments[0].recipe_id == recipe.id


async def test_duplicate_assignment_is_rejected(db_session: AsyncSession):
    admin = await _create_user(db_session, username="admin4", is_admin=True)
    station = Station(code="ST-003", name="Linea 3", created_by=admin.id)
    db_session.add(station)
    await db_session.flush()
    recipe = await create_test_recipe(db_session, user_id=admin.id, code="REC-Y")
    db_session.add(StationRecipeAssignment(
        station_id=station.id, recipe_id=recipe.id, assigned_by=admin.id,
    ))
    await db_session.flush()
    db_session.add(StationRecipeAssignment(
        station_id=station.id, recipe_id=recipe.id, assigned_by=admin.id,
    ))
    with pytest.raises(IntegrityError):
        await db_session.flush()
    await db_session.rollback()
