#!/usr/bin/env python

import optparse
import os
import sys
from ansiblereview.version import __version__
from ansiblereview import playbook, inventory, role
from appdirs import AppDirs
from fabric.api import env
from fabric.state import output
import ConfigParser


env.colorize_errors = True
output.warnings = False
output.running = False
env.warn_only = True


def _isinventory(filename):
    return 'inventory' in os.path.split(filename) or filename == 'hosts'


def role_root(arg):
    # converts /path/to/roles/rolename/tasks/install.yml
    # to rolename
    return os.path.dirname(os.path.dirname(args))


def _isinrole(arg):
    role_parent = os.path.basename(os.path.dirname(arg))
    return role_parent in ['tasks', 'handlers', 'defaults', 'templates', 'vars', 'meta']


def main(args):

    parser = optparse.OptionParser("%prog playbook_file|role_file|inventory_file",
                                   version="%prog " + __version__)

    config_dir = AppDirs("ansible-review", "com.github.willthames").user_config_dir
    config_file = os.path.join(config_dir, "config.ini")
    config = ConfigParser.RawConfigParser({'standards': None, 'lint': None})
    config.read(config_file)
    rulesdir = config.get('rules', 'standards')
    lintdir = config.get('rules', 'lint')
    parser.add_option('-d', dest='rulesdir',
                      help="Location of standards rules %s" % rulesdir,
                      default = rulesdir)
    parser.add_option('-r', dest='lintdir',
                      help="Location of additional lint rules %s" % lintdir,
                      default=lintdir)
    parser.add_option('-R', dest='recurse', default=False,
                      help="Recurse into roles (good if you have control "
                      "over the role, less useful otherwise)")
    options, args = parser.parse_args(args)
    if len(args) == 0:
        parser.print_help(file=sys.stderr)
        return 1

    for arg in args:
        if _isinrole(arg):
            role.review(role_root(arg), options)
        elif _isinventory(arg):
            inventory.review(arg, options)
        else:
            playbook.review(arg, options)


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
