#!/usr/bin/python

import argparse
import os
import subprocess
from pkg_resources import resource_string

from jinja2 import Template


DOCKER_CONTAINER = "testbox"
ANSIBLE_TESTDIR = os.path.join(os.getcwd(), ".ansible-test")


def generate_dockerfile(context):
    '''Returns the file path to the rendered Dockerfile'''
    rendered_dockerfile_contents = Template(
        resource_string("ansible_test", "resources/Dockerfile.j2")
    ).render(context)

    rendered_dockerfile_path = os.path.join(os.getcwd(), "Dockerfile")
    with open(rendered_dockerfile_path, "wb") as f:
        f.write(rendered_dockerfile_contents)

    return rendered_dockerfile_path


def generate_inventory():
    with open(os.path.join(ANSIBLE_TESTDIR, "inventory.yml"), "wb") as f:
        f.write(resource_string("ansible_test", "resources/inventory.yml"))


def generate_playbook():
    with open(os.path.join(ANSIBLE_TESTDIR, "playbook.yml"), "wb") as f:
        f.write(resource_string("ansible_test", "resources/playbook.yml"))


def main(context):
    if not os.path.exists(ANSIBLE_TESTDIR):
        os.mkdir(ANSIBLE_TESTDIR)

    generate_dockerfile(context)
    generate_inventory()
    generate_playbook()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("role", help="Role to test")
    parser.add_argument("--image", "-i", default="debian:stable",
                        help="Docker Base Image")

    args, extra_args = parser.parse_known_args()

    context = {
       'image': args.image,
       'extra_args': extra_args
    }

    main(context)

    # Build Docker Container
    subprocess.check_call(
        ['docker', 'build',
         '-t', DOCKER_CONTAINER, '.']
    )

    # Run Test Suite
    subprocess.check_call(
        ['docker', 'run',
         '-e', 'DOCKER_TEST_ROLE=%s' % args.role,
         '--privileged=true',
         '-it', DOCKER_CONTAINER]
    )
