#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# USAGE: convert_i18n_yaml.py [--data=i18n.yml] behave/i18n.py
"""
Generates I18N python module based on YAML description (i18n.yml).

REQUIRES:
  * argparse
  * six
  * PyYAML
"""

from __future__ import absolute_import, print_function
import argparse
import os.path
import six
import sys
import pprint
import yaml

HERE = os.path.dirname(__file__)
NAME = os.path.basename(__file__)
__version__ = "1.0"

def yaml_normalize(data):
    for part in data:
        keywords = data[part]
        for k in keywords:
            v = keywords[k]
            # bloody YAML parser returns a mixture of unicode and str
            if not isinstance(v, six.text_type):
                v = v.decode("UTF-8")
            keywords[k] = v.split("|")
    return data

def main(args=None):
    if args is None:
        args = sys.argv[1:]
    parser = argparse.ArgumentParser(prog=NAME,
                description="Generate python module i18n from YAML based data")
    parser.add_argument("-d", "--data", dest="yaml_file",
                default=os.path.join(HERE, "i18n.yml"),
                help="Path to i18n.yml file (YAML file).")
    parser.add_argument("output_file", default="stdout",
                help="Filename of Python I18N module (as output).")
    parser.add_argument("--version", action="version", version=__version__)

    options = parser.parse_args(args)
    if not os.path.isfile(options.yaml_file):
        parser.error("YAML file not found: %s" % options.yaml_file)

    # -- STEP 1: Load YAML data.
    languages = yaml.load(open(options.yaml_file))
    languages = yaml_normalize(languages)

    # -- STEP 2: Generate python module with i18n data.
    contents = u"""# -*- coding: UTF-8 -*-
# -- FILE GENERATED BY: convert_i18n_yaml.py with i18n.yml
# pylint: disable=line-too-long

languages = \\
"""
    if options.output_file in ("-", "stdout"):
        i18n_py = sys.stdout
        should_close = False
    else:
        i18n_py = open(options.output_file, "w")
        should_close = True
    i18n_py.write(contents.encode("UTF-8"))
    i18n_py.write(pprint.pformat(languages).encode("UTF-8"))
    i18n_py.write(u"\n")
    if should_close:
        i18n_py.close()
    return 0

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