#!/usr/bin/python
import os
import sys

if __name__ == '__main__':
    cur_file = os.path.abspath(__file__)
    django_dir = os.path.abspath(os.path.join(os.path.dirname(cur_file), '..'))
    sys.path.append(django_dir)
    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import collections
import datetime
import subprocess

import django.contrib.auth.models
import reversion

import groups.models

def gather_constitutions():
    gs = groups.models.Group.active_groups.all()
    additions = []
    changed = []
    for group in gs:
        defaults = dict(
            last_update=datetime.datetime.now(),
            last_download=datetime.datetime.now(),
        )
        constitution, created = groups.models.GroupConstitution.objects.get_or_create(group=group, defaults=defaults)
        if created: print "created record for %s" % (group, )
        constitution.source_url = group.constitution_url
        success, message, old_success = constitution.update()
        if success:
            if message == "new path":
                additions.append(constitution.dest_file)
            if message == 'updated in place' or message == 'new path':
                changed.append(group, )
        if (success != old_success) and (message != "no url"):
            print "%s: success=%s: %s, url=%s" % (group, success, message, constitution.source_url, )
    return additions, changed

def update_repo(additions, changed, ):
    git_dir = groups.models.constitution_dir
    if additions:
        subprocess.check_call(['git', 'add', ] + additions, cwd=git_dir, )
    msg = "Updated constitutions on %s\n\n%d added, %d changed total.\n\n %4s\tGroup\n%s" % (
        datetime.datetime.now(),
        len(additions),
        len(changed),
        "ID#",
        "\n".join(["%4d:\t%s" % (group.pk, group.name, ) for group in changed]),
    )
    subprocess.check_call(['git', 'commit', '--allow-empty', '-a', '-m', msg, ], cwd=git_dir, )

def webstat():
    constitutions = groups.models.GroupConstitution.objects.all()
    codes = collections.defaultdict(list)
    count = 0
    for const in constitutions:
        if count % 10 == 0: print count,
        code = const.webstat()
        codes[code].append(const)
        count += 1
    for code, gs in codes.items():
        print "\nCode: %s (count: %d)" % (code, len(gs), )
        for const in gs:
            print const.group
    for code, gs in codes.items():
        print "\nCode: %s (count: %d)" % (code, len(gs), )
        for const in gs:
            print const.source_url
    print "\n\n"
    for code, gs in codes.items():
        print "%4d\t%s" % (len(gs), code, )

def list_constitutions():
    constitutions = groups.models.GroupConstitution.objects.all()
    for const in constitutions:
        if const.dest_file: print const.dest_file

if __name__ == '__main__':
    if len(sys.argv) == 1 or sys.argv[1] == "gather":
        with reversion.create_revision():
            additions, changed = gather_constitutions()
            importer = django.contrib.auth.models.User.objects.get(username='gather-constitutions@SYSTEM', )
            reversion.set_user(importer)
            reversion.set_comment("gather constitutions")

        update_repo(additions, changed)
    elif sys.argv[1] == "webstat":
        webstat()
    elif sys.argv[1] == "list":
        list_constitutions()
    else:
        raise NotImplementedError
