#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Для тестирования можно отправлять сообщения в какой-нибудь тестовый чат:
./bin/incidents-notify "-1001495923591"

Чаты-адресаты:
    -1001417314665 -- Тревожный чат
    -1001350752218 -- чат аппдьюти

"""

import sys
import os.path
import urllib
import time

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

sys.path.insert(0, '/opt/direct-chat-bot')
from bots import TelegramBot

import logging
logging.getLogger("startrek_client.collections").addHandler(logging.NullHandler())

BOT_CONFIG = '/etc/direct-chat-bot/telegram.yaml'
TICKET_TAG = ''
MAX_TICKETS_TO_SHOW = 3

def main():
    try:
        CHAT_ID = sys.argv[1]
    except:
        sys.exit("need chat_id")

    global TICKET_TAG
    # тег нужен отдельный на каждый чат, чтобы новизну тикетов осознавать по отдельности для каждого
    TICKET_TAG = "incidents_notify_checked_%s" % CHAT_ID

    project_specific = ProjectSpecificSettings()
    startrek_client = Startrek(
        token=project_specific.get_startrek_robot_token(),
        useragent=os.path.basename(__file__)
    )

    new_tickets = list(startrek_client.issues.find("""
        (
        Queue: SPI Components: direct Tags: !"SERVICE:NP"
        or Queue: DIRECTINCIDENTS
        )
        created: > now() - 10d
        and Tags: !"%s"
        "Sort By": key desc
    """ % TICKET_TAG))

    new_tickets_text = (u"За прошедшее время появились новые инцидентные тикеты:\n" + "\n".join(
                            "<a href='https://st.yandex-team.ru/%s'>%s</a> (%s) (%s)" % (
                                ticket.key, ticket.key, ticket.summary, ticket.status.display
                            ) for ticket in new_tickets
                        )
                        if new_tickets
                        else u"За прошедшее время новых инцидентов не зарегистрировано")

    new_tickets_set = set(ticket.key for ticket in new_tickets)

    filters = [
            {
                'title': 'Open',
                'filter': 'Filter: 394163',
                },
            {
                'title': 'Basic markup required',
                'filter': 'Filter: 394164',
                },
            {
                'title': 'Basic markup required -- overdue',
                'filter': 'Filter: 394164 created: < now()-8d',
                },
            ]
    tickets_by_status_texts = []
    for f in filters:
        tickets_by_status = startrek_client.issues.find( f['filter'] )
        count = len(tickets_by_status)
        tickets_by_status = [
            ticket for ticket in tickets_by_status if ticket.key not in new_tickets_set
        ]

        # Если ссылка на сохраненный фильтр, то можно бы генерировать красивую ссылку типа https://st.yandex-team.ru/issues/394164
        # тогда на странице было бы видно название фильтра
        link = "https://st.yandex-team.ru/issues/?" + urllib.urlencode({
            '_q': f['filter'],
            })
    
        tickets_by_status_texts.append(
            "\n".join(
                ["<a href='%s'>%s</a> (%d)" % (link, f['title'], count)] +
                ["<a href='https://st.yandex-team.ru/%s'>%s</a> (%s)" % (ticket.key, ticket.key, ticket.summary)
                 for ticket in tickets_by_status[:MAX_TICKETS_TO_SHOW]]
            ) + (u"\n... и еще %d ..." % (count - MAX_TICKETS_TO_SHOW) if count - MAX_TICKETS_TO_SHOW > 0 else "")
        )

    message = u"%s\n\nТекущее состояние:\n%s\n\nДашборд по инцидентам: %s\nЧего не хватает в разметке: %s" % (
        new_tickets_text, 
        "\n\n".join(tickets_by_status_texts),
        "https://datalens.yandex-team.ru/aq299sisay946-direkt-incidenty",
        "https://datalens.yandex-team.ru/aq299sisay946-direkt-incidenty?tab=lWG",
    )
    TelegramBot(BOT_CONFIG).bot.sendMessage(CHAT_ID, message, parse_mode='html', disable_notification=True)

    startrek_client.bulkchange.update(
        [ticket.key for ticket in new_tickets],
        tags={'add': [TICKET_TAG]}
    ).wait()

    # спим немного, чтобы не успевать запуститься дважды
    time.sleep(15)

    return


if __name__ == '__main__':
    main()

