# Pylint doesn't play well with fixtures and dependency injection from pytest
# pylint: disable=redefined-outer-name

import os
import tarfile

import pytest

from buildstream.testing import cli  # pylint: disable=unused-import

from buildstream import utils, _yaml

# Project directory
DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",)


def generate_remote_import_element(input_path, output_path):
    return {
        "kind": "import",
        "sources": [
            {
                "kind": "remote",
                "url": "file://{}".format(input_path),
                "filename": output_path,
                "ref": utils.sha256sum(input_path),
            }
        ],
    }


@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize(
    "with_workspace,guess_element",
    [(True, True), (True, False), (False, False)],
    ids=["workspace-guess", "workspace-no-guess", "no-workspace-no-guess"],
)
def test_source_checkout(datafiles, cli, tmpdir_factory, with_workspace, guess_element):
    tmpdir = tmpdir_factory.mktemp(os.path.basename(__file__))
    project = str(datafiles)
    checkout = os.path.join(cli.directory, "source-checkout")
    target = "checkout-deps.bst"
    workspace = os.path.join(str(tmpdir), "workspace")
    elm_cmd = [target] if not guess_element else []

    if with_workspace:
        ws_cmd = ["-C", workspace]
        result = cli.run(project=project, args=["workspace", "open", "--directory", workspace, target])
        result.assert_success()
    else:
        ws_cmd = []

    args = ws_cmd + ["source", "checkout", "--deps", "none", "--directory", checkout, *elm_cmd]
    result = cli.run(project=project, args=args)
    result.assert_success()

    assert os.path.exists(os.path.join(checkout, "checkout-deps", "etc", "buildstream", "config"))


@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("force_flag", ["--force", "-f"])
def test_source_checkout_force(datafiles, cli, force_flag):
    project = str(datafiles)
    checkout = os.path.join(cli.directory, "source-checkout")
    target = "checkout-deps.bst"

    # Make the checkout directory with 'some-thing' inside it
    os.makedirs(os.path.join(checkout, "some-thing"))

    result = cli.run(
        project=project, args=["source", "checkout", force_flag, "--deps", "none", "--directory", checkout, target]
    )
    result.assert_success()

    assert os.path.exists(os.path.join(checkout, "checkout-deps", "etc", "buildstream", "config"))


@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_tar(datafiles, cli):
    project = str(datafiles)
    tar = os.path.join(cli.directory, "source-checkout.tar")
    target = "checkout-deps.bst"

    result = cli.run(project=project, args=["source", "checkout", "--tar", tar, "--deps", "none", target])
    result.assert_success()

    assert os.path.exists(tar)
    with tarfile.open(tar) as tf:
        expected_content = os.path.join(tar, "checkout-deps", "etc", "buildstream", "config")
        tar_members = [f.name for f in tf]
        for member in tar_members:
            assert member in expected_content


@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("compression", [("gz"), ("xz"), ("bz2")])
def test_source_checkout_compressed_tar(datafiles, cli, compression):
    project = str(datafiles)
    tarfile_name = "source-checkout.tar" + compression
    tar = os.path.join(cli.directory, tarfile_name)
    target = "checkout-deps.bst"

    result = cli.run(
        project=project,
        args=["source", "checkout", "--tar", tar, "--compression", compression, "--deps", "none", target],
    )
    result.assert_success()
    tar = tarfile.open(name=tar, mode="r:" + compression)
    assert os.path.join("checkout-deps", "etc", "buildstream", "config") in tar.getnames()


@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("deps", [("build"), ("none"), ("run"), ("all")])
def test_source_checkout_deps(datafiles, cli, deps):
    project = str(datafiles)
    checkout = os.path.join(cli.directory, "source-checkout")
    target = "checkout-deps.bst"

    result = cli.run(project=project, args=["source", "checkout", "--directory", checkout, "--deps", deps, target])
    result.assert_success()

    # Sources of the target
    if deps == "build":
        assert not os.path.exists(os.path.join(checkout, "checkout-deps"))
    else:
        assert os.path.exists(os.path.join(checkout, "checkout-deps", "etc", "buildstream", "config"))

    # Sources of the target's build dependencies
    if deps in ("build", "all"):
        assert os.path.exists(os.path.join(checkout, "import-dev", "usr", "include", "pony.h"))
    else:
        assert not os.path.exists(os.path.join(checkout, "import-dev"))

    # Sources of the target's runtime dependencies
    if deps in ("run", "all"):
        assert os.path.exists(os.path.join(checkout, "import-bin", "usr", "bin", "hello"))
    else:
        assert not os.path.exists(os.path.join(checkout, "import-bin"))


@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_except(datafiles, cli):
    project = str(datafiles)
    checkout = os.path.join(cli.directory, "source-checkout")
    target = "checkout-deps.bst"

    result = cli.run(
        project=project,
        args=["source", "checkout", "--directory", checkout, "--deps", "all", "--except", "import-bin.bst", target],
    )
    result.assert_success()

    # Sources for the target should be present
    assert os.path.exists(os.path.join(checkout, "checkout-deps", "etc", "buildstream", "config"))

    # Sources for import-bin.bst should not be present
    assert not os.path.exists(os.path.join(checkout, "import-bin"))

    # Sources for other dependencies should be present
    assert os.path.exists(os.path.join(checkout, "import-dev", "usr", "include", "pony.h"))


@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_fetch(datafiles, cli):
    project = str(datafiles)
    checkout = os.path.join(cli.directory, "source-checkout")
    target = "remote-import-dev.bst"
    target_path = os.path.join(project, "elements", target)

    # Create an element with remote source
    element = generate_remote_import_element(
        os.path.join(project, "files", "dev-files", "usr", "include", "pony.h"), "pony.h"
    )
    _yaml.roundtrip_dump(element, target_path)

    # Testing implicit fetching requires that we do not have the sources
    # cached already
    assert cli.get_element_state(project, target) == "fetch needed"

    args = ["source", "checkout"]
    args += [target, checkout]
    result = cli.run(project=project, args=["source", "checkout", "--directory", checkout, target])

    result.assert_success()
    assert os.path.exists(os.path.join(checkout, "remote-import-dev", "pony.h"))


@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_build_scripts(cli, tmpdir, datafiles):
    project_path = str(datafiles)
    element_name = "source-bundle/source-bundle-hello.bst"
    normal_name = "source-bundle-source-bundle-hello"
    checkout = os.path.join(str(tmpdir), "source-checkout")

    args = ["source", "checkout", "--include-build-scripts", "--directory", checkout, element_name]
    result = cli.run(project=project_path, args=args)
    result.assert_success()

    # There sould be a script for each element (just one in this case) and a top level build script
    expected_scripts = ["build.sh", "build-" + normal_name]
    for script in expected_scripts:
        assert script in os.listdir(checkout)


@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_tar_buildscripts(cli, tmpdir, datafiles):
    project_path = str(datafiles)
    element_name = "source-bundle/source-bundle-hello.bst"
    normal_name = "source-bundle-source-bundle-hello"
    tar_file = os.path.join(str(tmpdir), "source-checkout.tar")

    args = ["source", "checkout", "--include-build-scripts", "--tar", tar_file, element_name]
    result = cli.run(project=project_path, args=args)
    result.assert_success()

    expected_scripts = ["build.sh", "build-" + normal_name]

    with tarfile.open(tar_file, "r") as tf:
        for script in expected_scripts:
            assert script in tf.getnames()


# Test that the --directory and --tar options conflict
@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_options_tar_and_dir_conflict(cli, tmpdir, datafiles):
    project = str(datafiles)
    checkout = os.path.join(cli.directory, "source-checkout")
    tar_file = os.path.join(str(tmpdir), "source-checkout.tar")
    target = "checkout-deps.bst"

    result = cli.run(project=project, args=["source", "checkout", "--directory", checkout, "--tar", tar_file, target])

    assert result.exit_code != 0
    assert "ERROR: options --directory and --tar conflict" in result.stderr


# Test that the --compression option without --tar fails
@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_compression_without_tar(cli, tmpdir, datafiles):
    project = str(datafiles)
    checkout = os.path.join(cli.directory, "source-checkout")
    target = "checkout-deps.bst"

    result = cli.run(
        project=project, args=["source", "checkout", "--directory", checkout, "--compression", "xz", target]
    )

    assert result.exit_code != 0
    assert "ERROR: --compression specified without --tar" in result.stderr
