from __future__ import print_function

import argparse
import os
import sys

from .modulegraph import ModuleGraph


def parse_arguments():
    parser = argparse.ArgumentParser(
        conflict_handler="resolve",
        prog="%s -mmodulegraph" % (os.path.basename(sys.executable)),
    )
    parser.add_argument(
        "-d", action="count", dest="debug", default=1, help="Increase debug level"
    )
    parser.add_argument(
        "-q", action="store_const", dest="debug", const=0, help="Clear debug level"
    )
    parser.add_argument(
        "-m",
        "--modules",
        action="store_true",
        dest="domods",
        default=False,
        help="arguments are module names, not script files",
    )
    parser.add_argument(
        "-x",
        metavar="NAME",
        action="append",
        dest="excludes",
        default=[],
        help="Add NAME to the excludes list",
    )
    parser.add_argument(
        "-p",
        action="append",
        metavar="PATH",
        dest="addpath",
        default=[],
        help="Add PATH to the module search path",
    )
    parser.add_argument(
        "-g",
        "--dot",
        action="store_const",
        dest="output",
        const="dot",
        help="Output a .dot graph",
    )
    parser.add_argument(
        "-h",
        "--html",
        action="store_const",
        dest="output",
        const="html",
        help="Output a HTML file",
    )
    parser.add_argument(
        "scripts", metavar="SCRIPT", nargs="+", help="scripts to analyse"
    )

    opts = parser.parse_args()
    return opts


def create_graph(scripts, domods, debuglevel, excludes, path_extras):
    # Set the path based on sys.path and the script directory
    path = sys.path[:]

    if domods:
        del path[0]
    else:
        path[0] = os.path.dirname(scripts[0])

    path = path_extras + path
    if debuglevel > 1:
        print("path:", file=sys.stderr)
        for item in path:
            print("   ", repr(item), file=sys.stderr)

    # Create the module finder and turn its crank
    mf = ModuleGraph(path, excludes=excludes, debug=debuglevel)
    for arg in scripts:
        if domods:
            if arg[-2:] == ".*":
                mf.import_hook(arg[:-2], None, ["*"])
            else:
                mf.import_hook(arg)
        else:
            mf.run_script(arg)
    return mf


def output_graph(output_format, mf):
    if output_format == "dot":
        mf.graphreport()
    elif output_format == "html":
        mf.create_xref()
    else:
        mf.report()


def main():
    opts = parse_arguments()
    mf = create_graph(
        opts.scripts, opts.domods, opts.debug, opts.excludes, opts.addpath
    )
    output_graph(opts.output, mf)


if __name__ == "__main__":  # pragma: no cover
    try:
        main()
    except KeyboardInterrupt:
        print("\n[interrupt]")
