import pytest
from pathlib import Path

import dzgui.api.pefile as PeFile
from dzgui.api.pefile import VDFLoadError, AppNotInstalledError, AppMovedError

from dzgui.config.query import get_config
from dzgui.config.xdg import get_xdg_paths, parse_filepaths
from dzgui.const.constants import APPID_DAYZ

from tests.fixtures import fixture_path

pytestmark = pytest.mark.pefile


@pytest.fixture
def second_drive():
    return fixture_path("in_library_on_second_drive.vdf")


@pytest.fixture
def default_steam_path():
    paths = get_xdg_paths()
    xdg = parse_filepaths(paths)
    conf = get_config(xdg.config)
    return conf["default_steam_path"]


def test_pefile_length(default_steam_path):
    try:
        pe_file_path = PeFile.get_pefile_path(Path(default_steam_path), APPID_DAYZ)
        vers = PeFile.get_dayz_version(pe_file_path)
        st = PeFile.dayz_version_to_str(vers).split(".")
    except Exception as e:
        raise e
    assert len(st) == 3


def test_invalid_pefile_path():
    with pytest.raises(VDFLoadError):
        try:
            PeFile.get_pefile_path(Path("/not/a/path"), APPID_DAYZ)
        except Exception as e:
            raise e


@pytest.mark.parametrize(
    "fixture, exception",
    [
        ("not_in_library.vdf", AppNotInstalledError),
        ("in_library_but_bad_path.vdf", AppMovedError),
        ("malformed.vdf", VDFLoadError),
    ],
)
def test_not_in_library(fixture, exception):
    fixture = fixture_path(fixture)
    with pytest.raises(exception):
        try:
            PeFile.get_app_path(fixture, APPID_DAYZ)
        except Exception as e:
            raise e


def test_on_second_drive(second_drive):
    path = PeFile.get_app_path(second_drive, APPID_DAYZ)
    assert path == Path("/tmp")
