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

"""
Агрегирует события из локального juggler-client (видит в том числе запушенные через localhost/events)
Логика максимально приближена к агрегации на стороне juggler.

На вход подается список сервисов, которые хочется агрегировать. Сервисы поочередно ищутся в
локальном кеше, если не находим - к сервису применяется --nodata-mode. Если в результате
не нашли вообще ни одного сервиса для агрегации, применяется --nothing-to-aggregate-mode.

Статусы найденных сервисов агрегируются с помощью --aggregator в новое событие с заданным
--service. Description склеиваются.

Результирующее событие выводится в json или молча отправляется сразу в juggler (--juggler).
"""

import argparse
import sys
from direct_juggler.juggler import load_events, aggregate_events, filter_events, queue_events, events_to_json, NODATA_TO_STATUS

if __name__ == '__main__':
    parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=__doc__)
    parser.add_argument('--aggregator', type=str, default='logic_or', choices=['logic_and', 'logic_or'], help='Модуль агрегации локальных событий, по аналогии с juggler-модулями (default: logic_or)')
    parser.add_argument('--nodata-mode', type=str, default='force_crit', choices=NODATA_TO_STATUS.keys(), help='Что делать с сервисом, если такого события в локальном кеше нет. force_crit - считать, что оно как бы есть в состоянии CRIT (default), force_ok - в состоянии OK. skip - пропустить и перейти к следующему service')
    parser.add_argument('--nothing-to-aggregate-mode', type=str, default='force_crit', choices=NODATA_TO_STATUS.keys(), help='Результат агрегации, если ни одно событие под агрегацию не попало (аналогично nodata-mode)')
    parser.add_argument('--service', type=str, required=True, help='Имя сервиса - результата агрегации')
    parser.add_argument('--regex', action='store_true', default=False, help='Интерпретировать набор сервисов для агрегации как regexp (default: False)')
    parser.add_argument('--juggler', action='store_true', default=False, help='Отправить событие в juggler (default: False)')
    parser.add_argument('services', type=str, nargs='+', help='Набор локальных сервисов для агрегации, через пробел')
    args = parser.parse_args()

    jclient_events = load_events()
    events = filter_events(jclient_events, args.services, args.nodata_mode, args.regex)

    if not events and args.nothing_to_aggregate_mode == 'skip':
        sys.exit(0)
    elif not events:
        events.append({'service': 'empty', 'status': NODATA_TO_STATUS[args.nothing_to_aggregate_mode], 'description': 'autogenerated from nothing_to_aggregate_mode'})
 
    event = aggregate_events(events, args.aggregator, args.service)

    if args.juggler:
        queue_events([event])
    else:
        print events_to_json([event])
