#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: ai ts=4 sts=4 et sw=4 nu

from __future__ import (unicode_literals, absolute_import,
                        division, print_function)
import os
import sys

from rapidpro_controller import get_logger, log_success, log_failure
from rapidpro_controller.services import stop_all_services
from rapidpro_controller.postgres import configure_postgres_slave
from rapidpro_controller.redis import configure_redis_slave

logger = get_logger(os.path.basename(__file__))


def configure_postgres():
    success, conf_switched, dir_backedup, \
        backup_retrieved, recovery_confed = \
        configure_postgres_slave()
    if success:
        log_success(logger)
    else:
        log_failure(logger, msg="Please fix configuration manually.")
        logger.debug(". postgres.conf changed: {}".format(conf_switched))
        logger.debug(". main/ data directory backed-up: {}"
                     .format(dir_backedup))
        logger.debug(". initial data retrieved from master: {}"
                     .format(backup_retrieved))
        logger.debug(". recovery.conf created: {}".format(recovery_confed))
        return 1
    return 0


def configure_redis():
    success, backup_path, backup_restored = configure_redis_slave()
    if success:
        log_success(logger)
    else:
        log_failure(logger, msg="Please fix configuration manually.")
        logger.debug(". redis.conf backed-up to: {}".format(backup_path))
        logger.debug(". redis.conf backup restored: {}"
                     .format(backup_restored))
        return 1
    return 0


def main():
    logger.info("reconfiguring server for a slave role (postgres, redis).")

    logger.info(". stopping all services before configuration.")
    stopped_all, failed_to_stop = stop_all_services()
    if not stopped_all:
        log_failure(logger,
                    msg="unable to stop all services. "
                    "Please check before configuring: {}"
                    .format(",".join(failed_to_stop)))
        return 1

    # configure postgresql
    logger.info(". configuring postgresql for slave role")
    if configure_postgres() != 0:
        return 1

    # configure redis-server
    logger.info(". configuring redis for slave role")
    if configure_redis() != 0:
        return 1

    logger.info("server reconfigured for slave. services not started.")
    return 0


if __name__ == '__main__':
    sys.exit(main())
