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

import os
import sys
import datetime
import time
import requests
import argparse

requests.packages.urllib3.disable_warnings()

DCS = ['man', 'myt', 'sas', 'vla', 'iva']


def convert_time(time_str):
    if time_str.isdigit():
        return int(time_str)
    else:
        return int(time.mktime(datetime.datetime.strptime(time_str, '%Y-%m-%d %H:%M').timetuple()))


def parse_options():
    parser = argparse.ArgumentParser(
        description=(
            "Скриптик для создания события в infra.yandex-team.ru\n\n" +
            "OAuth токен надо положить в ~/.infra_oauth (получить его можно здесь: " +
            "https://oauth.yandex-team.ru/authorize?response_type=token&client_id=2a72805d65d44446aad8a6d849f1e4a4)"
        )
    )

    parser.add_argument(
        "-s", "--service", dest="serviceId", type=int, required=True,
        help="id сервиса",
    )
    parser.add_argument(
        "-e", "--environment", dest="environmentId", type=int, required=True,
        help="id окружения",
    )
    parser.add_argument(
        "-t", "--type", dest="type", choices=['issue', 'maintenance'], required=True,
        help="тип события",
    )
    parser.add_argument(
        "-sv", "--severity", dest="severity", choices=['major', 'minor'], required=True,
        help="уровень важности",
    )
    parser.add_argument(
        "--title", dest="title", type=str, required=True,
        help="заголовок события",
    )
    parser.add_argument(
        "--description", dest="description", type=str,
        help="описание события",
    )
    parser.add_argument(
        "--start-time", dest="startTime", type=str, required=True,
        help="время начала события (либо timestamp, либо datetime в формате (YYYY-MM-DD hh:mm)",
    )
    parser.add_argument(
        "--finish-time", dest="finishTime", type=str,
        help="время конца события (либо timestamp, либо datetime в формате (YYYY-MM-DD hh:mm)",
    )
    parser.add_argument(
        "--ticket", dest="tickets", action='append',
        help="тикет, связанный с событием (можно указать несколько)",
    )
    parser.add_argument(
        "-dc", dest="dc", action='append', choices=['man', 'myt', 'sas', 'vla', 'iva'],
        help="датацентр, которого затрагивает событие",
    )
    parser.add_argument(
        "--token", dest="token", type=str, default='~/.infra_oauth',
        help="кастомный путь до oauth-токена (по умолчанию: ~/.infra_oauth)",
    )

    opts, extra = parser.parse_known_args()

    if len(extra) > 0:
        parser.error("There are unknown parameters")

    opts.startTime = convert_time(opts.startTime)
    if opts.finishTime:
        opts.finishTime = convert_time(opts.finishTime)

    token_full_path = os.path.expanduser(opts.token)
    if not os.path.isfile(token_full_path):
         parser.error(u"File %s was not found" % token_full_path)

    with open(token_full_path, 'r') as fh:
        opts.token = fh.read().strip()
    return opts


def main():
    opts = parse_options()

    request_data = {
        field: getattr(opts, field, None)
        for field in [
            'serviceId', 'environmentId', 'type', 'severity', 'title', 'description',
            'startTime', 'finishTime', 'tickets'
        ]
        if getattr(opts, field, None)
    }

    if opts.tickets:
        request_data['tickets'] = ",".join(opts.tickets)

    for dc in DCS:
        request_data[dc] = getattr(opts, dc, None) is not None

    req = requests.post(
        'https://infra-api.yandex-team.ru/v1/events',
         json=request_data,
         headers={'Authorization': 'Oauth %s' % opts.token},
         verify=False
    )

    if req.status_code != 200:
        sys.exit("Event creation was failed, status code %s, response - \"%s\"" % (req.status_code, req.text))

    print "Event was created!\nhttps://infra.yandex-team.ru/event/%d" % req.json()['id']


if __name__ == '__main__':
    main()

