#!/usr/bin/env python3

import argparse
import doxec
import sys
import os

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="""
        Run code examples written in a documentation file to ensure the
        validity of the examples.
        """)

    parser.add_argument("--syntax", choices=doxec.parser.keys(),
        default="markdown",
        help="The syntax parser to be used for the listed files.")

    parser.add_argument("--version", action="store_true",
        help="Prints the version of the doxec package and exits.")

    parser.add_argument("--short", action="store_true",
        help="Suppresses the standard output of operations.")

    parser.add_argument("--plain", action="store_true",
        help="Do no use ASCII control characters, equal to DOXEC_COLOR=0.")

    parser.add_argument("--color", action="store_true",
        help="Force the usage ASCII control characters. This overrides DOXEC_COLOR=0.")

    parser.add_argument("documents", metavar="DOCUMENT", nargs="*", default=[],
        help="A document from which the code examples should be parsed and "
            "executed")

    args = parser.parse_args()

    if args.version:
        print("Doxec package version: %s" % doxec.__version__) 
        sys.exit(0)

    if len(args.documents) == 0:
        sys.exit(0)

    print("Doxec -- Copyright (c) 2017 Frank Sauerburger")


    parser = doxec.parser[args.syntax]

    plain = args.plain or \
        ("DOXEC_COLOR" in os.environ and os.environ["DOXEC_COLOR"] == '0')

    plain = plain and (not args.color)

    # Loop over documents
    for doc_path in args.documents:
        doc = doxec.Document(doc_path, syntax=parser)
        monitor = doxec.Monitor(doc_path, short=args.short, color=not plain)
        doc.run(monitor=monitor)

    # Print summary
    print("-"*80)
    color = "\033[31m" if monitor.fail_count > 0 else "\033[32m"

    if not plain: print(color, end="")
    print("Failed: %5d" % monitor.fail_count, end="")
    if not plain: print("\033[0m", end="")
    print()


    print("Total:  %5d" % monitor.total_count)

    # Return code equals number of failed operations
    sys.exit(monitor.fail_count)
