"""Tests for SQLAlchemy ORM models."""

from __future__ import annotations

from pathlib import Path

from conftest import init_test_db
from database.models import Project, Track, TrackStatus, generate_uuid
from database.repositories import ProjectRepository


def test_track_status_values() -> None:
    """Verify that TrackStatus has exactly ACTIVE and MISSING."""
    assert TrackStatus.ACTIVE.value == "active"
    assert TrackStatus.MISSING.value == "missing"
    assert len(TrackStatus) == 2


def test_generate_uuid() -> None:
    """Verify that generate_uuid returns a string UUID."""
    uuid_str = generate_uuid()
    assert isinstance(uuid_str, str)
    assert len(uuid_str) == 36


def test_project_model_fields() -> None:
    """Verify that Project model has the required fields."""
    project = Project(
        id=generate_uuid(),
        name="Test Project",
    )
    assert project.name == "Test Project"
    assert project.id is not None


def test_project_created_at_default(tmp_path: Path) -> None:
    """Verify that created_at is set automatically on flush."""
    session = init_test_db(tmp_path)
    try:
        project = Project(id=generate_uuid(), name="Test")
        session.add(project)
        session.flush()
        assert project.created_at is not None
    finally:
        session.close()


def test_track_model_fields() -> None:
    """Verify that Track model has the required fields."""
    track = Track(
        id=generate_uuid(),
        project_id=generate_uuid(),
        relative_path="album/song.wav",
        original_filename="song.wav",
        sha256="abc123",
        file_size=1024,
        status=TrackStatus.ACTIVE,
    )
    assert track.relative_path == "album/song.wav"
    assert track.original_filename == "song.wav"
    assert track.sha256 == "abc123"
    assert track.file_size == 1024
    assert track.status == TrackStatus.ACTIVE


def test_track_nullable_audio_fields() -> None:
    """Verify that audio metadata fields are nullable."""
    track = Track(
        id=generate_uuid(),
        project_id=generate_uuid(),
        relative_path="song.wav",
        original_filename="song.wav",
        sha256="abc123",
        file_size=1024,
        status=TrackStatus.ACTIVE,
    )
    assert track.duration is None
    assert track.channels is None
    assert track.sample_rate is None
    assert track.bit_depth is None


def test_track_default_status(tmp_path: Path) -> None:
    """Verify that the default status is ACTIVE after flush."""
    session = init_test_db(tmp_path)
    try:
        project = ProjectRepository.get_default_project(session)
        track = Track(
            id=generate_uuid(),
            project_id=project.id,
            relative_path="song.wav",
            original_filename="song.wav",
            sha256="abc123",
            file_size=1024,
        )
        session.add(track)
        session.flush()
        assert track.status == TrackStatus.ACTIVE
    finally:
        session.close()
