#!/usr/bin/env python
"""
Dump hivemind services structure to a directory tree with files
in it containing rules information.
"""
import os
import argparse

import yaml
import requests


PATHS = (
    "skynet.tools.sky",
    "sys.cgroup",
    "skynet.monitoring.cq",
    "skynet.services.cqudp",
    "skynet.services.cqueue",
    "skynet.services.heartbeat",
    "skynet.services.heartbeat-client",
    "skynet.services.heartbeat-server",
    "skynet.services.keychain",
    "skynet.services.kqueue",
    "skynet.services.logger",
    "skynet.services.netstate",
    "skynet.services.procman",
    "skynet.services.resolver",
    "skynet.services.shardstates",
    "skynet.services.copier",
    "skynet.services.skybone-coord",
)

def _indent_lines(f, source):
    for line in source.splitlines():
        f.write('  ')
        f.write(line)
        f.write('\n')


def dump(service_path, output_path):
    url = "https://hivemind.yandex-team.ru/ui/skynet/source_config/{}".format(
        service_path
    )
    output_path = os.path.join(output_path,
                               os.path.sep.join(service_path.split('.')))
    os.makedirs(output_path, mode=0o755, exist_ok=True)
    resp = requests.get(url, headers={"X-Requested-With": "XMLHttpRequest"})
    resp.raise_for_status()
    resp = resp.json()
    for i, record in enumerate(resp['records']):
        safe_name = record['name'].replace('/', '_')
        filename = os.path.join(output_path, '{:02d}-{}'.format(i, safe_name))
        with open(filename, 'w') as f:
            f.write('name: |\n')
            f.write('  {}\n'.format(record['name']))
            if record['groups_all']:
                f.write('all_hosts: true\n')
            else:
                f.write('selector: |\n')
                _indent_lines(f, record['groups'])
            f.write('config: |\n')
            _indent_lines(f, record['data'])
        with open(filename) as f:
            # just for syntax checking purpose
            yaml.load(f)


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('output_path')
    args = parser.parse_args()
    for path in PATHS:
        dump(path, args.output_path)


if __name__ == '__main__':
    main()
