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

description = """

Скрипт читает описание тикета, ищет все похожее на тикеты и линкует, если связи еще нет.
Временная мера, пока у Трекера проблемы с форматтером.

Посмотреть, что недопривязано из текста тикета:
    dt-link-tickets DIRECT-101682
Привязать все найденное явно (--do пишется строго с двумя дефисами):
    dt-link-tickets DIRECT-101682 --do

Обрабатывает только тикеты DIRECT
"""

import sys
import os

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

import re
import argparse
import subprocess
import logging
logging.getLogger("startrek_client.collections").addHandler(logging.NullHandler())

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'

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


def parse_options():
    parser = argparse.ArgumentParser(add_help=False)
    parser.add_argument("--do", dest="do", help="acually do the work", action="store_true")
    parser.add_argument("-h", "--help", dest="help", help="Справка", action="store_true")
    opts, extra = parser.parse_known_args()

    if opts.help:
        print description
        print parser.format_help()
        exit(0)

    opts.extra = extra

    tickets_ok = True
    for e in opts.extra:
        if not re.match(r'^DIRECT-[0-9]+$', e):
            print "bad ticket id: %s" % e
            tickets_ok = False
    if not tickets_ok:
        exit(1)

    if len(opts.extra) == 0:
        print "nothing to do"
        exit(0)

    return opts


def run():
    global startrek_client

    opts = parse_options()

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

    for ticket_id in opts.extra: 
        t = startrek_client.issues[ ticket_id ]
        links = t.links
        #print "%s\n%s" % (t.description, t.links)
        links_tracker = set()
        for l in links:
            #print "%s" % ([l.object.key, l.type.id])
            if l.type.id == 'relates':
                links_tracker.add(l.object.key)
        links_text = set()
        for tl in re.findall(r"DIRECT-[0-9]*", t.description):
            links_text.add(tl)
        to_link = links_text - links_tracker
        print "to link: %s" % len(to_link)
        link_count = 0
        for tl in sorted(to_link):
            print "%s %s" % (tl, startrek_client.issues[ tl ].summary)
            if opts.do:
                t.links.create(issue=tl, relationship='relates')
                print "linked"
                link_count += 1
        if link_count > 0:
            t.comments.create(text=u'Добавлены связи с тикетами, упомянутыми в тексте\n%s' % (SIGN))

    return


if __name__ == '__main__':
    run()

