#!/usr/bin/env python
'''
replaces '$fact' in template with facter facts
'''

import argparse
import json
import string
import subprocess
import sys

CMD = ['facter', '--json', '-p']
FACTS = ['default_region',
         'pop',
         'twitch_role',
         'twitch_environment',
         'default_gateway_interface',
         'interfaces_with_link',
         'hostname'
         ]


def get_facts(facts):
    p = subprocess.Popen(CMD + facts, stdout=subprocess.PIPE)
    p.wait()
    facts = ''.join(p.stdout.readlines())
    return json.loads(facts)


def _pretty_values(value):
    """
    Converts csv values to a list if there's more than 1 item
    Explicitly quote single values or individual items in a list
    Explicitly set to "None" for None types
    """
    if value is None:
        return '"None"'

    if isinstance(value, str):
        _list = value.split(",")

        if len(_list) > 1:
            return json.dumps(_list)

    return json.dumps(value)


def _active_interfaces(facts):
    """
    Returns a list of _active_ interfaces, including default gateway interface
    """
    active_interfaces = set()

    for answers in ["default_gateway_interface", "interfaces_with_link"]:
        interfaces = facts.get(answers)
        if interfaces is not None:
            active_interfaces.update(set(interfaces.split(",")))

    # Fallback to team0 if no interfaces were found from the given facts
    return list(active_interfaces) if len(active_interfaces) > 0 else ["team0"]


def render(args):
    facts = get_facts(args.facts)
    pretty = args.pretty

    # Fetch interfaces that we are interested in
    facts["interfaces"] = _active_interfaces(facts)

    # Prep values for rendering
    if pretty is True:
        facts = dict([(k, _pretty_values(v)) for k, v in facts.iteritems()])

    for line in args.tmpl:
        t = string.Template(line)
        sys.stdout.write(t.substitute(facts))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('-f', '--facts', nargs='*', default=FACTS,
                        help="space-seperated list of facts to template. default: %s" % FACTS)
    parser.add_argument(nargs='?', dest='tmpl', type=argparse.FileType('r'),
                        default=sys.stdin,
                        help="template file to render, default is stdin")
    parser.add_argument('-p', '--pretty', action='store_true',
                        help="Prettify facter values for template substitution")
    args = parser.parse_args()

    render(args)
