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

"""
Выгружает данные о RTC-виртуалках по списку определенных в clusters.json
platform-environments и сохраняет их в локальную svn-базу в виде json.
"""

import argparse
import getpass
import traceback
import sys
import os
import time
sys.path.extend(['share/pyshared', '/usr/local/share/pyshared'])

from ppcinv.helpers import *
from ppcinv.external_sources import *
from ppcinv.svn_storage import PPCInvSvnStorage


if __name__ == '__main__':
    parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=__doc__)
    parser.add_argument('--log-level', type=str, required=False, choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], default='ERROR', help='Logging level')
    parser.add_argument('--log-file', type=str, required=False, default=None, help='Log file')
    # TODO: default в tmpdir
    parser.add_argument('--db-path', type=str, required=False, default='~/ppcinv-db', help='Local path to store db with hosts metadata')
    parser.add_argument('--cluster-str-id', type=str, nargs='+', required=False, default=None, help='Update only specified clusters, like "direct/production/scripts-java"')
    args = parser.parse_args()

    logger = init_root_logger(args)

    svn = PPCInvSvnStorage(db_path=os.path.expanduser(args.db_path), svn_user=getpass.getuser(), svn_scheme='svn+ssh', svn_host='svn.yandex.ru', svn_path='direct-utils/ppcinv-db', cleanup_existing=True)
    clusters = svn.load_clusters()

    for cluster_conf in clusters:
        cluster_str_id = '/'.join(get_cluster_path_list(cluster_conf))
        if args.cluster_str_id and (cluster_str_id not in args.cluster_str_id):
            logger.debug('Skipping cluster ' + cluster_str_id)
            continue

        logger.info('Process cluster ' + cluster_conf['cluster_name'])
        time.sleep(10)

        old_hosts = svn.load_hosts(cluster_conf)
        if cluster_conf.get('source') != 'platform_nanny_gencfg':
            continue

        try:
            hosts = platform_nanny_gencfg_to_hosts_data(cluster_conf)
        except Exception as e:
            logging.critical('Cannot process cluster %s' % (cluster_conf['cluster_name'],))
            logging.debug(traceback.format_exc())
            continue

        actions = cluster_hosts_get_merge_actions(hosts, old_hosts)
        svn.merge_hosts(actions)

        logger.info('Saved cluster ' + cluster_conf['cluster_name'])

    logging.info('Db saved to %s. Run following commands:\ncd %s\nsvn st\nsvn diff\nsvn commit\ncd -;\nppcinv-svn-to-zk --db-path %s --zk-hosts zxzk01i.yandex.ru:2181,zxzk01f.yandex.ru:2181,zxzk01e.yandex.ru:2181 [--cluster-str-id direct/production/scripts-java] --log-level=DEBUG' % (args.db_path, args.db_path, args.db_path))
