#!/usr/bin/env python2

from __future__ import print_function

import locale
import os
import sys


def list_encodings():
    from collections import OrderedDict
    import encodings
    import glob

    encs = OrderedDict()
    path = os.path.dirname(sys.modules['encodings'].__file__)
    size = 0
    for filename in glob.glob(os.path.join(path, '*.py')):
        name = os.path.splitext(os.path.basename(filename))[0]
        if name not in ['aliases', 'encodings', 'undefined', '__init__']:
            encs[name] = []
            size = max(size, len(name))

    for alias, name in encodings.aliases.aliases.items():
        if name in encs:
            encs[name].append(alias)

    print('Available encodings:')
    for name, aliases in encs.items():
        print('{}: {}'.format(
            name.rjust(size),
            ','.join(sorted(aliases)),
        ))


def run():
    import argparse

    parser = argparse.ArgumentParser()
    codecs = parser.add_argument_group(
        'encodings',
        'Use ENCODING "help" to get a list of available encodings on your '
        'system.'
    )
    codecs.add_argument('-s', '--source-encoding', default='cp437',
        metavar='CODEC',
        help='source encoding (default: cp437)')
    codecs.add_argument('-t', '--target-encoding', default=None,
        metavar='CODEC',
        help='target encoding (default: autodetect)')
    parser.add_argument('-o', '--output', default='-',
        help='output (default: STDOUT)')
    parser.add_argument('filename', nargs='*')
    option = parser.parse_args()

    if not option.filename:
        option.filename = ['-']

    if 'help' in [option.target_encoding, option.source_encoding]:
        list_encodings()
        return 0

    if not option.target_encoding:
        lang, option.target_encoding = locale.getdefaultlocale()
    if not option.target_encoding:
        sys.stderr.write('{}: could not determine target encoding, using UTF-8'
                         .format(sys.argv[0]))
        option.target_encoding = 'UTF-8'

    if option.output in [None, '', '-']:
        output = sys.stdout
    else:
        output = open(option.output, 'wb')

    for filename in option.filename:
        if filename == '-':
            stream = sys.stdin
        else:
            stream = file(filename)

        source = stream.read()
        target = source.split('\x1aSAUCE')[0].decode(
            option.source_encoding,
        ).encode(
            option.target_encoding,
        )
        output.write(target)
        output.flush()

    if output != sys.stdout:
        output.close()


if __name__ == '__main__':
    sys.exit(run())
