#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import unicode_literals, print_function

import urllib2 as u2
import xml.etree.ElementTree as ET
import collections as col
import sys

Stat = col.namedtuple('Stat', ['count', 'name', 'branch', 'work',
                               'untranslated','fuzzy', 'translated', 'total'])

#titles = Stat(count='Номер', name='Име', branch='Клон', work='Работа',
#              untranslated='Непреведени',  fuzzy='Мъгляви', translated='Преведени',
#              total='Всичко')

titles = Stat(count=('Number', 'rjust'), name=('Name', 'ljust'),
              branch=('Branch', 'ljust'), work=('Work', 'ljust'),
              untranslated=('Untranslated', 'ljust'),  fuzzy=('Fuzyy', 'rjust'),
              translated=('Translated', 'rjust'), total=('All', 'rjust'))


def get_versions():
    versions_url = 'https://l10n.gnome.org/releases/xml'
    versions_data = u2.urlopen(versions_url)

    versions_tree = ET.parse(versions_data)
    versions_root = versions_tree.getroot()
    versions_xpath = './object/field[@name="name"]'
    version_elements = versions_root.findall(versions_xpath)
    versions = [e.text for e in version_elements]
    return versions


def get_stats(version):
    stats_url = 'https://l10n.gnome.org/languages/bg/{}/xml'.format(version)
    stats_data = u2.urlopen(stats_url)
    stats_tree = ET.parse(stats_data)
    stats_root = stats_tree.getroot()
    stats_xpath = './category/module'
    stats_elements = stats_root.findall(stats_xpath)
    results = []
    for stats_el in stats_elements:
        stat_id = stats_el.attrib['id']
        stat_branch = stats_el.attrib['branch']
        domains = stats_el.findall('./domain')
        for dom in domains:
            dom_id = dom.attrib['id']
            if dom_id == 'po':
                name = stat_id
            elif dom_id.startswith('po-'):
                name = '{}-{}'.format(stat_id, dom_id[3:])
            else:
                name = '{}-{}'.format(stat_id ,dom_id)
            translated = int(dom.findtext('./translated'))
            fuzzy = int(dom.findtext('./fuzzy'))
            untranslated  = int(dom.findtext('./untranslated'))
            work = fuzzy + untranslated
            total = work + translated
            s = Stat(count=None, name=name, branch=stat_branch,
                     translated=translated, fuzzy=fuzzy,
                     untranslated=untranslated, work=work, total=total)
            results.append(s)
    # sorts are stable
    results.sort(key=lambda s: s.name)
    results.sort(key=lambda s: s.fuzzy, reverse=True)
    results.sort(key=lambda s: s.untranslated, reverse=True)
    results.sort(key=lambda s: s.work, reverse=True)
    for i, s in enumerate(results):
        results[i] = s._replace(count=i+1)
    return results


def stats_max_lengths_sums(stats):
    name = 0
    branch = 0
    sum_translated = 0
    sum_fuzzy = 0
    sum_untranslated = 0
    sum_work = 0
    sum_total = 0

    for s in stats:
        name = max(name, len(s.name))
        branch = max(branch, len(s.branch))
        sum_translated = sum_translated + s.translated
        sum_fuzzy = sum_fuzzy + s.fuzzy
        sum_untranslated = sum_untranslated + s.untranslated
        sum_work = sum_work + s.work
        sum_total = sum_total + s.total

    max_len = Stat(count=len(str(len(stats))), name=name, branch=branch,
                   translated=len(str(sum_translated)), fuzzy=len(str(sum_fuzzy)),
                   untranslated=len(str(sum_untranslated)), work=len(str(sum_work)),
                   total=len(str(sum_total)))
    sums = Stat(count=len(stats), name='', branch='', translated=sum_translated,
                fuzzy=sum_fuzzy, untranslated=sum_untranslated, work=sum_work,
                total=sum_total)
    return {'max_len': max_len, 'sums': sums}


def divider(s):
    inner = '+'.join(['-' * (f + 1) for f in s]) 
    return inner.join(['|'] * 2)


def stat_line(max_len, s):
    args = []
    for i in range(len(max_len)):
        width = max_len[i] + 1
        method_name = 'rjust' if isinstance(s[i], int) else 'ljust'
        part = getattr(str(s[i]), method_name)(width)[:width]
        args.append(part)

    result = '|{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|'.format(*tuple(args))
    return result


def title_line(max_len):
    args = []
    for i in range(len(max_len)):
        width = max_len[i] + 1
        method_name = titles[i][1]
        part = getattr(titles[i][0], method_name)(width)[:width]
        args.append(part)

    result = '|{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|'.format(*tuple(args))
    return result


def main():
    #a = sys.args
    #versions = get_versions()
    #if not len(a) == 1 or a[0] not in versions:
    #    print('Give single argument, one of: {} '.format(versions))
    #    print('Will use {}'.format(versions[0]))
    stats = get_stats('gnome-3-18')
    sms = stats_max_lengths_sums(stats)
    max_len = sms['max_len']
    sums = sms['sums']

    print(max_len)
    print(sums)
    d = divider(max_len)
    print(d)
    print(title_line(max_len))
    print(d)
    for s in stats:
        print(stat_line(max_len, s))
    print(d)
    print(stat_line(max_len, sums))
              
if __name__ == '__main__':
    main()




