#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
import argparse
import codecs
import json


__author__ = 'Daniel Widerin <daniel@widerin.net>'
__license__ = 'MIT'


class HierarchicalDict(dict):

    def __init__(self, *args, **kwargs):
        self.update(*args, **kwargs)

    def __setitem__(self, key, val):
        dict.__setitem__(self, key, val)

    def update(self, *args, **kwargs):
        for key, val in dict(*args, **kwargs).items():
            keys = key.split('.')
            if len(keys) > 1:
                self._decode(keys, val)
            else:
                self[key] = val

    def _decode(self, keys, value):
        storage = self
        for key in keys[:-1]:
            if key not in storage:
                storage[key] = {}
            storage = storage[key]
        storage[keys[-1]] = value


def main():
    parser = argparse.ArgumentParser(
        description='Recover flattened json file.')
    parser.add_argument(
        'files', metavar='FILE', type=str, nargs='+',
        help='Files to process')
    parser.add_argument(
        '--indent', default=4, type=int, dest='indent',
        help='json indentation for outfile')
    args = parser.parse_args()

    for filename in args.files:
        try:
            raw = codecs.open(filename, 'r', encoding='utf-8').read()
            data = json.loads(raw, object_pairs_hook=HierarchicalDict)

            with codecs.open(filename, 'w', encoding='utf-8') as outfile:
                json.dump(data, outfile,
                          sort_keys=True,
                          indent=args.indent,
                          ensure_ascii=False)
        except Exception as ex:
            print('Error processing {0:s}'.format(filename), ex)


if __name__ == '__main__':
    main()
