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

import sys
import os

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

import yaml
import re
import subprocess

from project_specific import ProjectSpecificSettings

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 = u'/etc/direct-tokens/startrek'
APPS_CONF_FILE = u"/etc/yandex-direct/direct-apps.conf.yaml"
ARCADIA_URL = u'svn+ssh://arcadia.yandex.ru/arc'
DIRECT_TRUNK = ProjectSpecificSettings().svn_trunk_url()
SCRIPT_TAG = u'enrich_done'
ST_QUERY = u'Queue: DIRECTMIGR Status: !Closed Tags: !"%s" "Sort by": key desc' % SCRIPT_TAG

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


def add_followers(ticket):
    global startrek_client

    approvers = re.search(r'^approved by *(.*)$', ticket.description, re.M)
    if not approvers or not approvers.groups()[0]:
        return
    
    approvers = approvers.groups()[0].replace(',', ' ')
    approvers = [approver.strip() for approver in approvers.split(' ')]
    approvers = filter(lambda x: x, approvers)

    try:
        startrek_client.issues[ticket.key].update(followers=ticket.followers + approvers)
    except:
       pass


def link_related_tickets(ticket):
    global apps_dict, startrek_client

    result = re.search(ur'^([^:]+): Миграция (.+)$', ticket.summary)
    if not result or len(result.groups()) != 2:
        return

    app, filename = result.groups()

    if app.startswith('java'):
        svn_paths = ["%s/trunk/arcadia/%s/deploy" % (ARCADIA_URL, apps_dict[app]["primary-svn-dir"]),
                     "%s/trunk/arcadia/direct/deploy" % ARCADIA_URL]
    elif app == 'direct':
        svn_paths = ["%s/deploy" % DIRECT_TRUNK]
    else:
        return

    for svn_path in svn_paths:
        try:
            output = subprocess.check_output(['svn', 'log', '%s/%s' % (svn_path, filename), '--stop-on-copy'], stderr=subprocess.STDOUT)
            related_tickets = re.findall('DIRECT-[0-9]+', output, re.I)
            if not related_tickets:
                return
            related_tickets = list(set(related_tickets))

            for rel_ticket in related_tickets:
                startrek_client.issues[rel_ticket].comments.create(text=u'По этому тикету были коммиты миграции, тикет: %s\n%s' % (ticket.key, SIGN))

            startrek_client.issues[ticket.key].comments.create(text=u'По этой миграции были коммиты с тикетами:\n%s\n%s' % ('\n'.join(related_tickets), SIGN))
            return
        except:
            pass


def run():
    global apps_dict
    global startrek_client

    startrek_token = open(STARTREK_TOKEN_FILE).readline().strip()
    startrek_client = Startrek(token=startrek_token, useragent=SCRIPT_NAME)

    issues = startrek_client.issues.find(ST_QUERY)

    apps_dict = yaml.load(open(APPS_CONF_FILE))['apps']

    for ticket in issues:
        add_followers(ticket)
        
        link_related_tickets(ticket)

        startrek_client.issues[ticket.key].update(tags=startrek_client.issues[ticket.key].tags + [SCRIPT_TAG])
        
    return


if __name__ == '__main__':
    run()

