#!/usr/bin/env python
"""
Dump skynet version information from hivemind to a specified file.
"""
import argparse

import yaml
import requests


RULES_URL = 'https://hivemind.yandex-team.ru/ui/skynet/versions/current_config'
ALIASES_URL = 'https://hivemind.yandex-team.ru/ui/skynet/versions/conf_aliases'
HIVEMIND_HEADERS = {"X-Requested-With": "XMLHttpRequest"}

SANDBOX_RESOURCES_URL = '\
https://sandbox.yandex-team.ru:443/api/v1.0/task/{}/resources'


def dump(output_file):
    resp = requests.get(RULES_URL, headers=HIVEMIND_HEADERS)
    resp.raise_for_status()
    resp = resp.json()
    resp['default_rule']['name'] = 'Default Rule'
    rules = resp['rules'] + [resp['default_rule']]

    resp = requests.get(ALIASES_URL, headers=HIVEMIND_HEADERS)
    resp.raise_for_status()
    resp = resp.json()
    aliases = {alias['id']: alias['task_id'] for alias in resp['aliases']}

    results = []
    all_task_ids = set()
    for rule in rules:
        config_source = {}
        config_source['description'] = rule['sandbox_task_name']
        rec = {'name': rule['name'],
               'desc': rule['desc'],
               'user': rule['author'],
               'config_source': config_source}
        if 'group' in rule:
            rec['selector'] = rule['group'].strip()
        else:
            rec['selector'] = None
        if rule['task_alias_id']:
            config_source['rtype'] = 'released'
            config_source['release'] = aliases[rule['task_alias_id']]
            rec['task_id'] = config_source['release']
        else:
            config_source['rtype'] = 'by_id'
            rec['task_id'] = rule['task_id']
        all_task_ids.add(rec['task_id'])
        results.append(rec)

    resources = {}
    for task_id in all_task_ids:
        url = SANDBOX_RESOURCES_URL.format(task_id)
        resp = requests.get(url)
        resp.raise_for_status()
        for resource in resp.json()['items']:
            if resource['type'] == 'SKYNET_BINARY':
                resources[task_id] = resource['id']
                break

    for rec in results:
        rec['config'] = {'resource_id': resources[rec['task_id']]}
        rec['config_source']['resource'] = resources[rec['task_id']]
        del rec['task_id']

    yaml.dump(results, output_file)


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('output_file', type=argparse.FileType('w'))
    args = parser.parse_args()
    dump(args.output_file)


if __name__ == '__main__':
    main()
