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

import yaml
from pymongo import MongoClient

from genisys.web.model import MongoStorage


def create_section(storage, username):
    parent_path = 'skynet'
    name = 'versions'
    desc = 'Define where and what version of skynet should be installed'
    parent = storage.get_section_subtree(parent_path, max_depth=0)
    storage.create_section(username, parent_path, parent['revision'],
                           name, desc=desc, owners=[],
                           stype='sandbox_resource',
                           stype_options={'resource_type': 'SKYNET_BINARY'})


def create_rule(storage, username, rule):
    path = 'skynet.versions'
    section = storage.get_section_subtree(path, max_depth=0)
    storage.create_rule(username, 'skynet.versions',
                        old_revision=section['revision'], parent_rule=None,
                        rulename=rule['name'], desc=rule['desc'], editors=[],
                        selector=rule['selector'], config=rule['config'],
                        config_source=rule['config_source'])


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('-u', '--user', required=True,
                        help="Name of user on whose behalf section and "
                             "rules will be created. Must be one of section "
                             "'skynet' owners.")
    parser.add_argument('input_file', type=argparse.FileType('r'))
    parser.add_argument('--mongo-uri', '-m', default='mongodb://127.0.0.1',
                        help='mongodb connection uri')
    parser.add_argument('--db-name', '-n', default='genisys',
                        help='database name (defaults to "genisys")')
    args = parser.parse_args()
    mongo_client = MongoClient(args.mongo_uri)
    storage = MongoStorage(mongo_client, args.db_name)
    data = yaml.load(args.input_file)
    create_section(storage, args.user)
    for rule in data:
        create_rule(storage, args.user, rule)


if __name__ == '__main__':
    main()
