import pytest
import testinfra

check_output = testinfra.get_backend(
    "local://"
).get_module("Command").check_output

@pytest.fixture
def Pihole(Docker):
    ''' used to contain some script stubbing, now pretty much an alias.
    Also provides bash as the default run function shell '''
    def run_bash(self, command, *args, **kwargs):
        cmd = self.get_command(command, *args)
        if self.user is not None:
            out = self.run_local(
                "docker exec -u %s %s /bin/bash -c %s",
                self.user, self.name, cmd)
        else:
            out = self.run_local(
                "docker exec %s /bin/bash -c %s", self.name, cmd)
        out.command = self.encode(cmd)
        return out

    funcType = type(Docker.run)
    Docker.run = funcType(run_bash, Docker, testinfra.backend.docker.DockerBackend)
    return Docker

@pytest.fixture
def Docker(request, args, image, cmd):
    ''' combine our fixtures into a docker run command and setup finalizer to cleanup '''
    assert 'docker' in check_output('id'), "Are you in the docker group?"
    docker_run = "docker run {} {} {}".format(args, image, cmd)
    docker_id = check_output(docker_run)

    def teardown():
        check_output("docker rm -f %s", docker_id)
    request.addfinalizer(teardown)

    docker_container = testinfra.get_backend("docker://" + docker_id)
    docker_container.id = docker_id
    return docker_container

@pytest.fixture
def args(request):
    ''' -t became required when tput began being used '''
    return '-t -d'

@pytest.fixture(params=['debian', 'centos'])
def tag(request):
    ''' consumed by image to make the test matrix '''
    return request.param

@pytest.fixture()
def image(request, tag):
    ''' built by test_000_build_containers.py '''
    return 'pytest_pihole:{}'.format(tag)

@pytest.fixture()
def cmd(request):
    ''' default to doing nothing by tailing null, but don't exit '''
    return 'tail -f /dev/null'