#!/usr/bin/env python3


import argparse
import sys
from qas.framework import Framework


def str2bool(v):
    if isinstance(v, bool):
        return v
    if v.lower() in ('yes', 'true', 't', 'y', '1'):
        return True
    elif v.lower() in ('no', 'false', 'f', 'n', '0'):
        return False
    else:
        raise argparse.ArgumentTypeError('Boolean value expected.')


def main():
    parser = argparse.ArgumentParser(formatter_class=lambda prog: argparse.RawTextHelpFormatter(prog, width=200), description="""example:
  qas -t ops/example-docs/helloworld
  qas -t ops/example-docs -c helloworld
  qas -t ops/example-docs --case-name HelloWorld
  qas -t ops/example-docs --case-regex HelloWorld
  qas -t ops/example-docs -c setup_teardown --skip-setup --skip-teardown
  qas -t ops/example-docs/custom -x ops/x
  qas -t ops/example-docs/parallel --parallel
  qas -t ops/example-docs/parallel --parallel --test-pool-size 10 --case-pool-size 10 --step-pool-size 10
  qas -t ops/example-docs/helloworld --reporter html > 1.html
  qas -t ops/example-docs/helloworld --hook trace
  qas -t ops/example-docs/helloworld --reporter json > 1.json
  qas --json-result 1.json --reporter html > 1.html
""")
    parser.add_argument("-r", "--reporter", default="text", help="test report format. Built in support of `html/json/text`. Support user defined extension in `x`")
    parser.add_argument("-t", "--test", help="test root directory")
    parser.add_argument("-c", "--case", help="test subdirectory")
    parser.add_argument("--lang", help="report language. Built in support of `zh|en`")
    parser.add_argument("-x", "--x", help="user defined extension directory. Support to expand drivers/reporters/hooks/util-functions")
    parser.add_argument("--customize", help="customize filename")
    parser.add_argument("--parallel", nargs="?", const=True, default=False, type=str2bool, help="run parallel")
    parser.add_argument("--hook", help="runtime hook. Separated by comma. Built in support of `debug/report/slsLog/stdLog/email/dingTalk`. Support user defined extension in `x`")
    parser.add_argument("--step-pool-size", type=int, help="step thread pool size")
    parser.add_argument("--case-pool-size", type=int, help="case thread pool size")
    parser.add_argument("--test-pool-size", type=int, help="test thread pool size")
    parser.add_argument("--case-name", help="filter case by name")
    parser.add_argument("--case-id", help="filter case by id. id consists of case-filename.index")
    parser.add_argument("--case-regex", help="filter case by regex")
    parser.add_argument("--json-result", help="json result report. If you specify this field, you can convert the JSON report to another format report")
    parser.add_argument("--skip-set-up", nargs="?", const=True, default=False, type=str2bool, help="skip set up cases")
    parser.add_argument("--skip-tear-down", nargs="?", const=True, default=False, type=str2bool, help="skip tear down cases")
    args = parser.parse_args()

    fw = Framework(
        test_directory=args.test,
        case_directory=args.case,
        case_name=args.case_name,
        case_id=args.case_id,
        case_regex=args.case_regex,
        skip_set_up=args.skip_set_up,
        skip_tear_down=args.skip_tear_down,
        reporter=args.reporter,
        x=args.x,
        json_result=args.json_result,
        parallel=args.parallel,
        hook=args.hook,
        step_pool_size=args.step_pool_size,
        case_pool_size=args.case_pool_size,
        test_pool_size=args.test_pool_size,
        customize=args.customize,
        lang=args.lang,
    )
    if args.json_result:
        fw.format()
    elif not fw.run():
        sys.exit(1)


if __name__ == '__main__':
    main()
