#!/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 subprocess
import datetime
import direct_juggler.juggler as dj

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)

TAG = u'notification_done'
STARTREK_TOKEN_FILE = '/etc/direct-tokens/startrek'
SCRIPT_NAME = os.path.basename(__file__)
HOSTNAME = subprocess.check_output(['hostname', '-f']).strip()
SIGN = u"----\nСкрипт %s с машины %s" % (SCRIPT_NAME, HOSTNAME)
SERVICE_NAME = 'scripts.issues_reminder.working'
DESCRIPTION_URL = "https://docs.yandex-team.ru/direct-dev/releases/release-ticket-call"

APPS_CONFIG_PATH = '/etc/yandex-direct/direct-apps.conf.yaml'
with open(APPS_CONFIG_PATH, 'r') as fh:
    APPS_CONFIG = yaml.load(fh)['apps']

with open(STARTREK_TOKEN_FILE) as st_fd:
    startrek_token = st_fd.readline().strip()

startrek_client = Startrek(token=startrek_token, useragent=SCRIPT_NAME)


def run():
    if datetime.datetime.today().weekday() >= 5:
        return

    for app, app_config in APPS_CONFIG.items():
        notification_app_tag = u"%s_%s" % (TAG, app)
        testing_app_tag = u"release_testing_%s" % app

        tested_apps_filter = u''
        if app_config['type'] and app_config['tracker-affected-app']:
            tested_apps_filter = u'"Tested apps": !%s ' % app_config['tracker-affected-app']

        tickets = startrek_client.issues.find((
            u'Queue: DIRECT, TESTIRT Status: !Closed ' + 
            u'Tags: release_testing Tags: %s Tags: !%s Tags: !%s Tags: !кроссрелизные_зависимости ' + 
            tested_apps_filter +
            u'(Type: !bug OR (Type: bug AND Created: < today() - 1h))'
        ) % (testing_app_tag, notification_app_tag, TAG))

        tickets_to_tag = []

        for ticket in tickets:
            try:
                if 'dont_remind' in ticket.tags:
                    continue
                user = None
                if ticket.qaEngineer:
                    user = ticket.qaEngineer.id
                elif ticket.assignee:
                    user = ticket.assignee.id
                elif ticket.createdBy and ticket.createdBy.id != 'ppc':
                    user = ticket.createdBy.id
                else:
                    continue
    
                comment_text = u'Привет, тебя ждет задача в релизе приложения %s!\n' % app
                comment_text += u'Напоминаем, что тикеты в релизах имеют приоритет над другими.\n'
                comment_text += u'Ожидается, что ты сделаешь все что надо в течение 3 часов от начала релиза (время между 19:00 и 9:00 не учитывается).\n' 
                comment_text += u'Подробнее: %s\n' % DESCRIPTION_URL 
                comment_text += SIGN
                startrek_client.issues[ticket.key].comments.create(
                    text=comment_text,
                    summonees=[user],
                )
                tickets_to_tag.append(ticket)
            except Exception as e:
                print e, type(e)

        if tickets_to_tag:
            startrek_client.bulkchange.update(
                list(tickets_to_tag),
                tags={'add': [notification_app_tag]}
            ).wait()
    return


if __name__ == '__main__':
    try:
        run()
        dj.queue_events([{
            'service': SERVICE_NAME,
            'status': 'OK',
            'description': 'OK',
        }]) 
    except Exception as e:
        dj.queue_events([{
            'service': SERVICE_NAME,
            'status': 'CRIT',
            'description': "unexpected exception (%s) %s" % (type(e), e)
        }])

