#!/opt/dosis2/bin/python3-venv

from datetime import datetime
import sys, getopt, subprocess, socket
import psycopg2
import logging.config

logging.config.dictConfig({
    'disable_existing_loggers': False,
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s {ident}.%(name)s [%(filename)s:%(lineno)s] %(message)s'.format(
                ident='dosis-backup'
            )
        },
        'simple': {
            'format': '%(levelname)s [%(filename)s:%(lineno)s] %(message)s'
        }
    },
    'handlers': {
        'info': {
            'level': 'INFO',
            'class': 'logging.handlers.SysLogHandler',
            'address': '/dev/log',
            'formatter': 'verbose'
        },
        'debug': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'stream': sys.stdout,
            'formatter': 'simple'
        }
    },
    'loggers': {
        'logger': {
            'handlers': ['info', 'debug'],
            'level': 'DEBUG'
        }
    }
})


logger = logging.getLogger('logger')


# backup command examples
# aws s3 sync --delete /opt/dosis2/backup/Wednesday s3://dosis-site-backups/sites/CUST20362/SS20362/Wednesday
# aws s3 sync --delete /opt/dosis2/backup/Wednesday s3://dosis-site-backups/sites/CUST10001/SS10034/Wednesday

def get_dow():
    return datetime.today().strftime('%A')


def get_dafe_tag():
    return socket.gethostname().upper()


def get_cust_num():
    try:
        conn = psycopg2.connect("dbname='dosis2' user='dsuper' host='localhost'")
        cur = conn.cursor()
        cur.execute("""
        SELECT site.site_settings.value as site_setting_value
        FROM site.site_settings
        LEFT JOIN site.site_setting_types ON (site.site_settings.setting_type_id = site.site_setting_types.id)
        WHERE site.site_setting_types.tag = 'CUSTOMER_NUMBER';
        """)
        row = cur.fetchone()
        return row[0]
    except psycopg2.OperationalError as err:
        logger.error(err)


def run_cmd(cmd_to_run):
    try:
        res = subprocess.run(cmd_to_run, universal_newlines=True, shell=True)
        return res.returncode
    except Exception as err:
        logger.error('ERROR: %s' % str(err))


def are_you_sure(backup_cmd, bypass=False):
    # if bypass flag is set, skip the question and just run the command
    # this should only be used for the fully automated version
    if bypass:
        return True
    msg = """You are about to run:\n\n{cmd}\n\nPlease verify the backup information is correct before continuing\n\nType y/n to continue:""".format(cmd=backup_cmd)
    while True:
        reply = str(input(msg).lower().strip())
        if reply[0] == 'y':
            return True
        elif reply[0] == 'n':
            return False
        else:
            logger.info('ERROR: Invalid response type \'y\' or \'n\'')

def bypass_are_you_sure():
    try:
        arg_list = sys.argv[1:]
        options = 'b'
        long_options = ['bypass']
        # get the bypass option if there is one
        args, vals = getopt.getopt(arg_list, options, long_options)
        for a, v in args:
            if a in ('-b', '--bypass'):
                return True
            else:
                return False
    except Exception as err:
        logger.error('ERROR: Bypass failed %s' % str(err))
        sys.exit(1)


if __name__ == '__main__':
    try:
        backup_cmd_and_path = 'aws s3 sync --delete /opt/dosis2/backup/{dow} s3://dosis-site-backups/sites/CUST{cust_num}/{dafe_tag}/{dow}'.format(
            dow=get_dow(),
            cust_num=get_cust_num(),
            dafe_tag=get_dafe_tag())

        if are_you_sure(backup_cmd_and_path, bypass_are_you_sure()):
            logger.info('Sending backup to AWS')
            cmd_res = run_cmd(backup_cmd_and_path)
            if cmd_res == 0:
                logger.info('backup to aws success')
                sys.exit(0)
            else:
                logger.error('backup to aws failed')
                sys.exit(cmd_res)
        else:
            logger.info('Doing nothing, bye bye')
    except Exception as err:
        logger.error('ERROR: %s' % str(err))
