#!/usr/bin/python
# -*- coding: utf8 -*-

import sys
import os
import direct_dist_pkgdata
import argparse
import apt_pkg
import apt

sys.path.insert(0, '/opt/direct-py/startrek-python-client-sni-fix')
from startrek_client import Startrek

import yaml
import json
import re
import subprocess
from collections import defaultdict

pathlist = ["/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin", "/usr/games", "/usr/local/games"]
os.environ["PATH"] = os.pathsep.join(pathlist)

STARTREK_TOKEN_FILE = '/etc/direct-tokens/startrek'

branches = ['unstable', 'testing', 'prestable', 'stable']
archs = ['i386', 'amd64', 'all']
reps_to_compare = [('direct-trusty', 'yandex-trusty'), ('direct-common', 'common')]
script_tag = 'deb-packages'
ST_QUERY = u'Queue: DIRECTADMIN Tags: "%s" Created: > today() - "3w"' % script_tag

HOSTNAME = subprocess.check_output(['hostname', '-f']).strip()
SCRIPT_NAME = os.path.basename(__file__)
SIGN = u"----\nСкрипт %s с машины %s" % (SCRIPT_NAME, HOSTNAME)

def run():
    apt_pkg.init()
    startrek_token = open(STARTREK_TOKEN_FILE).readline().rstrip()
    startrek_client = Startrek(token=startrek_token, useragent=SCRIPT_NAME)

    issues = startrek_client.issues.find(ST_QUERY)

    if issues:
        return

    description = u''

    data = defaultdict(lambda: defaultdict(dict))
    for reps in reps_to_compare:
        cur_description = u''
        for rep in reps:
            for br in branches:
                for arch in archs:
                    path = direct_dist_pkgdata.get_path(rep, br, arch)
                    data[rep][br][arch] = direct_dist_pkgdata.get_parsed_data(path)

        packages_dict = defaultdict(dict)
        for rep in reps:
            for br in branches:
                for arch in archs:
                    for package in data[rep][br][arch]:
                        if not package[0] in packages_dict[rep] or not packages_dict[rep][package[0]] or (package[1] and apt_pkg.version_compare(packages_dict[rep][package[0]], package[1]) < 0):
                            packages_dict[rep][package[0]] = package[1]

        for package in packages_dict[reps[0]]:
            if packages_dict[reps[0]][package] and package in packages_dict[reps[1]] and packages_dict[reps[1]][package] and apt_pkg.version_compare(packages_dict[reps[0]][package], packages_dict[reps[1]][package]) < 0:
                cur_description += '%s: %s < %s\n' % (package, packages_dict[reps[0]][package], packages_dict[reps[1]][package])

        if cur_description:
            description += u'**%s vs %s**:\n<{ раскрыть список\n%s}>\n\n' % (reps[0], reps[1], '\n'.join(sorted(cur_description.split('\n'))))

    if description:
         startrek_client.issues.create(
             queue='DIRECTADMIN',
             summary=u'В общих репозиториях появились новые версии пакетов',
             type={'name': 'Task'},
             tags=[script_tag],
             description=u"%s\n%s" % (description, SIGN),
         )
    return

if __name__ == '__main__':
    run()
