#!python
from __future__ import print_function, unicode_literals

import sys
import logging
import optparse
import os
import fileinput
import yaml
import collections

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import temptation
from temptation import logger

def get_opts_and_args(argv):
    loglevelchoices = ['DEBUG', 'INFO', 'WARN', 'ERROR']
    optparser = optparse.OptionParser(
        prog = argv[0],
        usage='Usage: %prog [OPTION] -t template datafile...',
        description = 'Resolve template for datafiles. Datafiles can be yaml or json',
        version='%s %s' % ("%prog", temptation.__version__)
    )
    optparser.add_option('-t', '--template', dest='templatefilename', help="Template to be resoved")
    optparser.add_option('-l', '--log-level', type='choice',
        choices=loglevelchoices, dest='loglevel', default=loglevelchoices[1],
        help="Log level. Choices: %s; Defaults to %s" % (loglevelchoices, loglevelchoices[1])
    )
    optparser.add_option('--encoding', default='utf-8', help='endoding of input files. Default: [%default]')
    return optparser.parse_args(argv[1:])

def yaml_from_filename(filename):
    try:
        with open(filename) as infile:
            return yaml.load(infile)
    except Exception, e:
        logger.error("Could not load yaml from %s" % (filename), exc_info=True)

def template_from_filename(filename):
    result = collections.OrderedDict()
    try:
        with open(filename) as infile:
            data = yaml.load(infile)
        if isinstance(data, list):
            logger.error("list")
            result["actions"] = data
        elif isinstance(data, basestring):
            result["actions"] = [{"print": data}]
        else:
            result.update(data)
    except Exception, e:
        logger.error("Could not load yaml from %s" % (filename), exc_info=True)
    return result

def main(argv):
    opts, args = get_opts_and_args(argv)
    logger.setLevel(eval('logging.%s' % opts.loglevel))
    logger.debug("main(%s)" % args)
    template = temptation.Template("".join(fileinput.input(opts.templatefilename, openhook=fileinput.hook_encoded(opts.encoding))))
    docs = yaml.load_all("".join(fileinput.input(args, openhook=fileinput.hook_encoded(opts.encoding))))
    for doc in docs:
        sys.stdout.write(template.resolve(doc))

if __name__ == "__main__":
    main(sys.argv)
