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

TODO = '''
 - уметь вывод без рамочек (удобнее для grep/awk)
 - уметь вывод без шапки (тоже удобнее для grep и т.п.)
 - (?) уметь json (если сложные данные, то проще скриптуется)
 - показывать статусы RS-ов (для каждого будет несколько, т.к. несколько LB)
 - показывать RS-ы (и статусы) по имени сервиса, не только по id
 - переименовать в dt-l3-mgr
 - уметь токен читать из home
'''

help = '''
    slb-l3-manager list-slb direct
    slb-l3-manager list-rs 3499
'''

import os
import sys
import json
import requests
from prettytable import PrettyTable

requests.packages.urllib3.disable_warnings()

API_URL = u"https://l3-api.tt.yandex-team.ru"
token = os.environ.get("OAUTH", "")

cmds = {}

def init_cmds():
    global cmds
    cmds = {
            'list-slb': {
                'code': cmd_list_slb,
                'description': 'список виртуальных сервисов, принадлежащих abc-сервису',
                },
            'list-rs': {
                'code': cmd_list_rs,
                'description': 'список риалов для одного виртуального сервиса',
                },
            }
    return

def cmd_list_slb(argv):
    if len(argv) < 1:
        print u"abc service is required"
        sys.exit(1)

    headers = {'Authorization': 'OAuth %s' % token}
    r = requests.get(u"%s%s" % (API_URL, u"/api/v1/service?abc__exact=%s&_all" % sys.argv[0]), headers=headers, verify=False)
    services = r.json()['objects']

    table = PrettyTable(['svc_id', 'fqdn', 'rs_groups'])
    table.align = 'l'

    for service in services:
        r = requests.get(u"%s%s" % (API_URL, service['url']), headers=headers, verify=False)
        cfg = r.json()
        #print json.dumps(cfg, sort_keys=True, indent=2)
        #break
        if not cfg['vs']:
            continue

        table.add_row([service['id'],  service['fqdn'], ",".join(cfg['vs'][0]['group'])])

    print table
    return

def cmd_list_rs(argv):
    headers = {'Authorization': 'OAuth %s' % token}
    if len(argv) < 1:
        print u"service id is required"
        sys.exit(1)

    svc_id = argv[0]
    r = requests.get(u"%s%s" % (API_URL, "/api/v1/service/%s" % svc_id), headers=headers, verify=False)
    service = r.json()
    # может ли быть несколько id в vs_id = service['config']['vs_id']? Что тогда делать?
    vs_id = service['config']['vs_id'][0]
    # TODO читать список аккуратно с пейджингом -- на случай, если перестанем помещаться в лимиты на одну страницу
    r = requests.get(u"%s%s" % (API_URL, "/api/v1/service/%s/vs/%s/rs?_limit=100" % (svc_id, vs_id)), headers=headers, verify=False)
    #r = requests.get(u"%s%s" % (API_URL, "/api/v1/service/740/vs/%s/rsstate?_limit=100" % (vs_id)), headers=headers, verify=False)
    data = r.json()
    #print json.dumps(data, sort_keys=True, indent=2)
    table = PrettyTable(['location', 'fqdn',])
    table.align = 'l'
    for rs in data['objects']:
        table.add_row([",".join(rs['location']), rs['fqdn']])
    print table
    return

if __name__ == "__main__":
    init_cmds()

    if not token:
        print u"you must provide your OAuth-token for l3-manager in environment variable 'OAUTH'"
        print u"you can get token here https://oauth.yandex-team.ru/authorize?response_type=token&client_id=0427b538222547f88a0549104c476f78"
        sys.exit(1)

    sys.argv.pop(0)

    if len(sys.argv) < 1:
        print u"expecting a command, stop\ncurrently implemented commands: %s" % (", ".join(cmds.keys()))
        sys.exit(1)

    cmd = sys.argv.pop(0)

    cmds[cmd]['code'](sys.argv)

    exit(0)
