#!/usr/bin/env python
"""
    CIJOE Test Runner
"""
import argparse
import uuid
import sys
import os
import cij.runner
import cij.util
import cij

def parse_args():
    """Parse command-line arguments for cij_runner"""

    prsr = argparse.ArgumentParser(
        description="cij_runner - CIJOE Test Runner",
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    prsr.add_argument(
        "testplan",
        help="Path to the testplan to run",
    )
    prsr.add_argument(
        "env",
        help="Path to the environment definition",
    )
    prsr.add_argument(
        "--output",
        help="Path to directory in which to store runner output",
        default=os.sep.join([
            "/tmp",
            "trun-%s" % str(uuid.uuid4())[:8]
        ])
    )
    prsr.add_argument(
        "-v", "--verbose",
        help="increase output verbosity, 0 = quiet, 1 = some, 1 > alot",
        action="count",
        default=0
    )

    args = prsr.parse_args()
    dargs = vars(args)

    return { k.upper(): dargs[k] for k in dargs }

def main():
    """
    Parse environment variables and command-line arguments constructing a
    configuration for which to invoke the runner
    """

    evars = cij.paths_from_env("CIJ", [
        "ROOT", "ENVS", "TESTPLANS", "TESTCASES", "TESTSUITES", "MODULES",
        "HOOKS"
    ])
    args = parse_args()

    conf = {}
    conf.update(evars)
    conf.update(args)

    # Setup path to testplan
    conf["TESTPLAN_FPATH"] = cij.util.expand_path(conf["TESTPLAN"])
    if not os.path.exists(conf["TESTPLAN_FPATH"]):
        cij.err("TESTPLAN_FPATH: %r, does not exist" % conf["TESTPLAN_FPATH"])
        return 1
    conf["TESTPLAN_FNAME"] = os.path.basename(conf["TESTPLAN_FPATH"])
    conf["TESTPLAN_NAME"] = ".".join(conf["TESTPLAN_FNAME"].split(".")[:-1])

    # Setup path to env script
    conf["ENV_FPATH"] = cij.util.expand_path(conf["ENV"])
    if not os.path.exists(conf["ENV_FPATH"]):
        cij.err("ENV_FPATH: %r, does not exist" % conf["ENV_FPATH"])
        return 1
    conf["ENV_FNAME"] = os.path.basename(conf["ENV_FPATH"])
    conf["ENV_NAME"] = ".".join(conf["ENV_FNAME"].split(".")[:-1])

    conf["OUTPUT"] = cij.util.expand_path(conf["OUTPUT"])
    if not os.path.exists(conf["OUTPUT"]):
        try:
            os.makedirs(conf["OUTPUT"])
        except OSError as exc:
            cij.err("rnr: FAILED: makedirs OUTPUT: %r, exc: %r" % (
                conf["OUTPUT"], exc
            ))
            return 1

    cij.warn("rnr: { OUTPUT: %r }" % conf["OUTPUT"])

    rcode = cij.runner.main(conf)
    if rcode:
        cij.err("rnr: rcode: %r" % rcode)

    cij.warn("rnr: { OUTPUT: %r }" % conf["OUTPUT"])

    return rcode

if __name__ == "__main__":
    sys.exit(main())
