import os
import shutil
import asyncio

import pytest

from compman import storage
from compman import xcsoar
from .fixtures.soaringspot import SoaringSpotFixture
from .fixtures.soarscore import SoarScoreFixture
from .fixtures.activitytestbed import ActivityTestbed
from .fixtures.widgettestbed import WidgetTestbedFactory

HERE = os.path.dirname(__file__)


@pytest.fixture()
def soaringspot():
    ssf = SoaringSpotFixture()
    ssf.setUp()
    try:
        yield ssf
    finally:
        ssf.tearDown()


@pytest.fixture()
def soarscore():
    ssf = SoarScoreFixture()
    ssf.setUp()
    try:
        yield ssf
    finally:
        ssf.tearDown()


@pytest.fixture
def storage_dir(tmpdir):
    storage.init(tmpdir)
    yield tmpdir
    storage.deinit()


@pytest.fixture
def widget_testbed():
    yield WidgetTestbedFactory()


@pytest.fixture
def activity_testbed(mocker):
    yield ActivityTestbed(mocker)


@pytest.fixture
def xcsoar_dir(tmpdir):
    xcsoar_sample_dir = os.path.join(HERE, "fixtures", "xcsoar")
    xcsoardir = os.path.join(tmpdir, ".xcsoar")
    shutil.copytree(xcsoar_sample_dir, xcsoardir)
    xcsoar.init(xcsoardir)
    yield xcsoardir
    xcsoar.deinit()


@pytest.fixture
def async_sleep(mocker):
    realsleep = asyncio.sleep

    async def sleep_mock(time: float) -> None:
        await realsleep(0)

    mocker.patch("asyncio.sleep", sleep_mock)
