#!/usr/bin/env python3

import argparse
import collections
import enum
import subprocess
import sys

import regen
import test_
import util

EXAMPLES = """
Examples:

Regen goldens and checked in bindings based on changed files in the current
repo

    fidldev regen

Explicitly specify regen scripts:

    fidldev regen fidlc fidlgen_dart
    fidldev regen all

Check which regen commands should be run:

    fidldev regen --dry-run --no-build

Run tests based on changed files in the current repo:

    fidldev test

Explicitly specify tests:

    fidldev test fidlc hlcpp llcpp c

Interactively filter test targets:

    fidldev test --interactive

Check which tests should be run:

    fidldev test --dry-run --no-build --no-regen

Pass flags to invocations of fx test:

    fidldev test --fx-test-args "-v -o --dry"

"""


def test(args):
    success = True
    if args.targets:
        if not args.no_regen:
            util.print_warning(
                'explicit test targets provided, skipping regen...')
        success = test_.test_explicit(
            args.targets, not args.no_build, args.dry_run, args.interactive,
            args.fx_test_args)
    else:
        changed_files = util.get_changed_files()
        if not args.no_regen:
            regen.regen_changed(changed_files, not args.no_build, args.dry_run)
            changed_files = util.get_changed_files()
        success = test_.test_changed(
            changed_files, not args.no_build, args.dry_run, args.interactive,
            args.fx_test_args)
        if args.dry_run:
            print_dryrun_warning()
    if not success:
        sys.exit(1)


def regen_cmd(args):
    if args.targets:
        regen.regen_explicit(args.targets, not args.no_build, args.dry_run)
    else:
        changed_files = util.get_changed_files()
        regen.regen_changed(changed_files, not args.no_build, args.dry_run)
        if args.dry_run:
            print_dryrun_warning()


def print_dryrun_warning():
    print(
        'NOTE: dry run is conservative and assumes that regen will '
        'always change files. If goldens do not change during an actual '
        'run, fewer tests/regen scripts may be run.')


parser = argparse.ArgumentParser(
    description="FIDL development workflow tool",
    formatter_class=argparse.RawDescriptionHelpFormatter,
    epilog=EXAMPLES)
subparsers = parser.add_subparsers()

test_parser = subparsers.add_parser("test", help="Test your FIDL changes")
test_parser.set_defaults(func=test)
test_targets = [name for (name, _) in test_.TEST_GROUPS] + ['all']
test_parser.add_argument(
    'targets',
    metavar='target',
    nargs='*',
    help=
    "Manually specify targets to regen, where a target is one of {}. Omit positional arguments to test based on changed files"
    .format(test_targets))
test_parser.add_argument(
    "--dry-run",
    "-n",
    help="Print out test commands without running",
    action="store_true",
)
test_parser.add_argument(
    "--no-build",
    "-b",
    help="Don't rebuild targets used for testing",
    action="store_true",
)
test_parser.add_argument(
    "--no-regen",
    "-r",
    help="Don't regen goldens before running tests",
    action="store_true",
)
test_parser.add_argument(
    "--interactive",
    "-i",
    help="Interactively filter tests to be run",
    action="store_true",
)
test_parser.add_argument(
    "--fx-test-args",
    "-t",
    help=
    "Extra flags and arguments to pass to any invocations of fx test. The flag value is passed verbatim. By default, only '-v' is used.",
    default='-v',
)

regen_parser = subparsers.add_parser("regen", help="Run regen commands")
regen_parser.set_defaults(func=regen_cmd)
regen_targets = [name for (name, _) in regen.REGEN_TARGETS] + ['all']
regen_parser.add_argument(
    'targets',
    metavar='target',
    nargs='*',
    help=
    "Manually specify targets to regen, where a target is one of {}. Omit positional arguments to regen based on changed files"
    .format(regen_targets))
regen_parser.add_argument(
    "--dry-run",
    "-n",
    help="Print out commands without running them",
    action="store_true",
)
regen_parser.add_argument(
    "--no-build",
    "-b",
    help="Don't rebuild targets used for regen",
    action="store_true",
)

if __name__ == '__main__':
    args = parser.parse_args()
    args.func(args)
