from __future__ import absolute_import, unicode_literals

import os
import subprocess
import sys

import pytest

import virtualenv

try:
    from pathlib import Path
except ImportError:
    from pathlib2 import Path

ROOT_DIR = Path(__file__).parents[1]


@pytest.fixture(scope="session")
def clean_python(tmp_path_factory):
    path = tmp_path_factory.mktemp("activation-test-env")
    prev_cwd = os.getcwd()
    try:
        os.chdir(str(path))
        home_dir, _, __, bin_dir = virtualenv.path_locations(str(path / "env"))
        virtualenv.create_environment(home_dir, no_pip=True, no_setuptools=True, no_wheel=True)

        site_packages = subprocess.check_output(
            [
                os.path.join(bin_dir, virtualenv.EXPECTED_EXE),
                "-c",
                "from distutils.sysconfig import get_python_lib; print(get_python_lib())",
            ],
            universal_newlines=True,
        ).strip()

        pydoc_test = path.__class__(site_packages) / "pydoc_test.py"
        pydoc_test.write_text('"""This is pydoc_test.py"""')
    finally:
        os.chdir(str(prev_cwd))

    yield home_dir, bin_dir, pydoc_test


@pytest.fixture()
def sdist(tmp_path):
    """make assertions on what we package"""
    import tarfile

    path = os.environ.get("TOX_PACKAGE")
    if path is not None:
        dest_path = tmp_path / "sdist"
        dest_path.mkdir()
        prev = os.getcwd()
        try:
            os.chdir(str(dest_path))
            tar = tarfile.open(path, "r:gz")
            tar.extractall()
            return next(dest_path.iterdir())
        finally:
            os.chdir(prev)
    return None


@pytest.fixture(scope="session")
def wheel(tmp_path_factory):
    """test that we can create a virtual environment by feeding to a clean python the wheels content"""
    dest_path = tmp_path_factory.mktemp("wheel")
    env = os.environ.copy()
    try:
        subprocess.check_output(
            [sys.executable, "-m", "pip", "wheel", "-w", str(dest_path), "--no-deps", str(ROOT_DIR)],
            universal_newlines=True,
            stderr=subprocess.STDOUT,
            env=env,
        )
    except subprocess.CalledProcessError as exception:
        assert not exception.returncode, exception.output

    wheels = list(dest_path.glob("*.whl"))
    assert len(wheels) == 1
    wheel = wheels[0]
    return wheel


@pytest.fixture()
def extracted_wheel(tmp_path, wheel):
    dest_path = tmp_path / "wheel-extracted"

    import zipfile

    with zipfile.ZipFile(str(wheel), "r") as zip_ref:
        zip_ref.extractall(str(dest_path))
    return dest_path
