"""Mock test."""

from pathlib import Path
from unittest.mock import AsyncMock, MagicMock, patch

import pytest

from supervisor.backups.backup import BackupLocation
from supervisor.backups.const import LOCATION_CLOUD_BACKUP, LOCATION_TYPE, BackupType
from supervisor.backups.validate import ALL_FOLDERS
from supervisor.coresys import CoreSys
from supervisor.mounts.mount import Mount

from tests.const import TEST_ADDON_SLUG


@pytest.fixture(name="backup_mock")
def fixture_backup_mock():
    """Backup class mock."""
    with patch("supervisor.backups.manager.Backup") as backup_mock:
        backup_instance = MagicMock()
        backup_mock.return_value = backup_instance

        backup_instance.store_addons = AsyncMock(return_value=None)
        backup_instance.store_folders = AsyncMock(return_value=None)
        backup_instance.store_homeassistant = AsyncMock(return_value=None)
        backup_instance.store_addons = AsyncMock(return_value=None)
        backup_instance.store_supervisor_config = AsyncMock(return_value=None)
        backup_instance.restore_folders = AsyncMock(return_value=True)
        backup_instance.restore_homeassistant = AsyncMock(return_value=None)
        backup_instance.restore_addons = AsyncMock(return_value=(True, []))
        backup_instance.restore_repositories = AsyncMock(return_value=None)
        backup_instance.restore_supervisor_config = AsyncMock(return_value=(True, []))
        backup_instance.remove_delta_addons = AsyncMock(return_value=True)

        yield backup_mock


@pytest.fixture
def partial_backup_mock(backup_mock):
    """Partial backup mock."""
    backup_instance = backup_mock.return_value
    backup_instance.sys_type = BackupType.PARTIAL
    backup_instance.folders = []
    backup_instance.addon_list = [TEST_ADDON_SLUG]
    backup_instance.supervisor_version = "9999.09.9.dev9999"
    backup_instance.location = None
    backup_instance.all_locations = {
        None: BackupLocation(path=Path("/"), protected=False, size_bytes=0)
    }
    backup_instance.validate_backup = AsyncMock()
    yield backup_mock


@pytest.fixture
def full_backup_mock(backup_mock):
    """Full backup mock."""
    backup_instance = backup_mock.return_value
    backup_instance.sys_type = BackupType.FULL
    backup_instance.folders = ALL_FOLDERS
    backup_instance.addon_list = [TEST_ADDON_SLUG]
    backup_instance.supervisor_version = "9999.09.9.dev9999"
    backup_instance.location = None
    backup_instance.all_locations = {
        None: BackupLocation(path=Path("/"), protected=False, size_bytes=0)
    }
    backup_instance.validate_backup = AsyncMock()
    yield backup_mock


@pytest.fixture(name="backup_locations")
async def fixture_backup_locations(
    request: pytest.FixtureRequest, coresys: CoreSys, mount_propagation, mock_is_mount
) -> list[LOCATION_TYPE]:
    """Return a list of prcoessed backup locations."""
    locations: list[LOCATION_TYPE] = []
    loaded = False
    for location in request.param:
        if location in {None, LOCATION_CLOUD_BACKUP}:
            locations.append(location)
        else:
            if not loaded:
                await coresys.mounts.load()

            await coresys.mounts.create_mount(
                Mount.from_dict(
                    coresys,
                    {
                        "name": location,
                        "usage": "backup",
                        "type": "cifs",
                        "server": "test.local",
                        "share": "test",
                    },
                )
            )
            locations.append(coresys.mounts.get(location))

    return locations
