"""Unit tests for ensure_blla_model.main()."""

from unittest.mock import MagicMock, call, patch

import ensure_blla_model


# ─── Model already loadable ───────────────────────────────────────────────────


def test_main_returns_early_when_model_is_loadable():
    """When the model exists and loads cleanly, no download or rename occurs."""
    with (
        patch("os.path.exists", return_value=True),
        patch.object(ensure_blla_model, "_model_is_loadable", return_value=True),
        patch.object(ensure_blla_model, "_download_blla") as mock_download,
        patch("os.rename") as mock_rename,
    ):
        ensure_blla_model.main()

    mock_download.assert_not_called()
    mock_rename.assert_not_called()


# ─── Model exists but is incompatible ─────────────────────────────────────────


def test_main_replaces_incompatible_model():
    """An incompatible model is renamed and replaced with a fresh download."""
    fake_path = "/app/models/blla.mlmodel"
    downloaded_path = "/tmp/downloaded.mlmodel"

    with (
        patch.object(ensure_blla_model, "BLLA_MODEL_PATH", fake_path),
        patch("os.path.exists", return_value=True),
        patch.object(ensure_blla_model, "_model_is_loadable", return_value=False),
        patch.object(ensure_blla_model, "_download_blla", return_value=downloaded_path),
        patch("os.rename") as mock_rename,
        patch("shutil.copy2") as mock_copy,
        patch("os.makedirs"),
    ):
        ensure_blla_model.main()

    mock_rename.assert_called_once_with(fake_path, fake_path + ".incompatible")
    mock_copy.assert_called_once_with(downloaded_path, fake_path)


# ─── Model missing ────────────────────────────────────────────────────────────


def test_main_downloads_when_model_missing():
    """When the model file doesn't exist at all, it is downloaded without rename."""
    fake_path = "/app/models/blla.mlmodel"
    downloaded_path = "/tmp/downloaded.mlmodel"

    with (
        patch.object(ensure_blla_model, "BLLA_MODEL_PATH", fake_path),
        patch("os.path.exists", return_value=False),
        patch.object(ensure_blla_model, "_model_is_loadable") as mock_loadable,
        patch.object(ensure_blla_model, "_download_blla", return_value=downloaded_path),
        patch("os.rename") as mock_rename,
        patch("shutil.copy2") as mock_copy,
        patch("os.makedirs"),
    ):
        ensure_blla_model.main()

    mock_loadable.assert_not_called()
    mock_rename.assert_not_called()
    mock_copy.assert_called_once_with(downloaded_path, fake_path)
