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

import os
import sys
import time
sys.path.insert(0, '/var/lib')

import telepot
import argparse
import requests
import json

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)

TELEGRAM_TOKEN_FILE = '/etc/direct-tokens/telegram'
JUGGlER_APIV2_URL = 'http://juggler-api.search.yandex.net/v2'
CHECKS_METHOD = 'checks/get_checks_state'
HEADERS = {"Content-Type": "application/json", "Accept": "application/json"}


chat_aliases = {
    "Direct.Monitoring": "-1001149314926",
    "Direct.Monitoring.Calls": "-1001303668967",
}


def parse_options():
    parser = argparse.ArgumentParser(description="пишет информацию о текущем состоянии juggler проверок в телеграмный чат")

    parser.add_argument("-c", "--chat",  dest="chat", help="id чата, куда писать сообщения", type=str)
    parser.add_argument("-t", "--tags", dest="tags", help="juggler тэг (несколько тэгов через запятую) для выборки событий", type=str)
    parser.add_argument("-q", "--quiet", dest="quiet", help="не писать сообщение, когда все проверки OK", action='store_true', default=False)
    parser.add_argument("-l", "--list", dest="list", help="вывести список известных чатов (для подстановки в параметр --chat)", action='store_true')
    opts, extra = parser.parse_known_args()

    if opts.list:
        print "\n".join(chat_aliases.keys())
        sys.exit(0)

    if not opts.chat or not opts.tags:
        print "--chat and --tags are required for sending"
        sys.exit(1)

    if opts.chat in chat_aliases:
        opts.chat = chat_aliases[opts.chat]

    return opts


def run():
    opts = parse_options()

    with open(TELEGRAM_TOKEN_FILE, 'r') as fd: 
        telegram_token = fd.readline().strip()
    telegram_client = telepot.Bot(telegram_token)

    tags = opts.tags.split(',')

    resp = requests.post(
        "%s/%s" % (JUGGlER_APIV2_URL, CHECKS_METHOD),
        data=json.dumps({"filters": [{"tags": [tag]} for tag in tags], "statuses": ["CRIT", "WARN"]}),
        headers=HEADERS
    )
    data = json.loads(resp.content)
    data['items'] = sorted(data['items'], key=lambda x: (x['status'], x['host'], x['service']))

    rows = []

    for event in data['items']:
        rows.append('%s %s::%s <a href="https://juggler.yandex-team.ru/check_details/?host=%s&service=%s">>></a>' % (
            event['status'],
            event['host'],
            event['service'],
            event['host'], 
            event['service']
        ))

    msg = u"Juggler/%s\n" % opts.tags
    msg += u" || ".join([u"%s: %d" % (status['status'], status['count']) for status in data['statuses']])
    if rows:
        msg += u"\n\n" + u"\n".join(rows)

    # если все ОК и --quiet, то ничего не отсылаем
    if not rows and opts.quiet:
        msg = u""

    if msg:
        telegram_client.sendMessage(chat_id=opts.chat, text=msg, parse_mode='html')

    # чтобы нормально работали локи на запуск в zookeeper
    time.sleep(10)


if __name__ == '__main__':
    run()

