#!python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#
# Copyright © 2015, 2022 Adrian Perez <aperez@igalia.com>
#
# Distributed under terms of the MIT license.

import hipack


def import_format(formatname, modulename=None):
    from importlib import import_module
    if modulename is None:
        modulename = formatname
    try:
        return import_module(modulename)
    except ImportError:
        raise SystemExit("Format '" + formatname + "' requires the '"
                + modulename + "' module, which is not installed")

def load_hipack(fd):
    return hipack.load(fd)

def save_hipack(data, fd):
    hipack.dump(data, fd)

def save_hipack_compact(data, fd):
    hipack.dump(data, fd, indent=False)

def load_json(fd):
    return import_format("json").load(fd)

def save_json(data, fd):
    import_format("json").dump(data, fd)

def load_yaml(fd):
    return import_format("yaml").safe_load(fd)

def save_yaml(data, fd):
    import_format("yaml").safe_dump(data, fd)

def load_msgpack(fd):
    return import_format("msgpack").load(fd)

def save_msgpack(data, fd):
    import_format("msgpack").dump(data, fd)


formats = {
    "hipack":
        (load_hipack, save_hipack),
    "hipack-compact":
        (load_hipack, save_hipack_compact),
    "json":
        (load_json, save_json),
    "yaml":
        (load_yaml, save_yaml),
    "msgpack":
        (load_msgpack, save_msgpack),
}


import argparse, sys
parser = argparse.ArgumentParser()
parser.add_argument('input', nargs='?', type=argparse.FileType('r'),
        help='Input file or - [default: stdin]', default=sys.stdin)
parser.add_argument('output', nargs='?', type=argparse.FileType('w'),
        help='Output file [default: stdout]', default=sys.stdout)
parser.add_argument('-f', '--from', dest='from_format', default='json',
        help='Read input in the specified FORMAT [default: %(default)s]',
        metavar='FORMAT')
parser.add_argument('-t', '--to', dest='to_format', default='hipack',
        help='Write output in the specified FORMAT [default: %(default)s]',
        metavar='FORMAT')
parser.add_argument('--formats', default=False, action='store_true',
        help='Print list of supported formats and exit')
parser.add_argument('--hipack-module-version', default=False,
        action='store_true', dest='hipack_module_version',
        help="Show the version of the hipack Python module")

if __name__ == "__main__":
    args = parser.parse_args()
    if args.formats:
        [print(name) for name in sorted(formats.keys())]
    elif args.hipack_module_version:
        print(hipack.__version__)
    else:
        try:
            load = formats[args.from_format][0]
        except KeyError:
            raise SystemExit("No such format: " + options.from_format)
        try:
            save = formats[args.to_format][1]
        except KeyError:
            raise SystemExit("No such format: " + options.to_format)

        save(load(args.input), args.output)
