#!/usr/bin/env python
#This file is part of ERP DB Copy. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import sys
import os
import optparse
import subprocess
import logging
from psycopg2 import connect

from erpdbcopy import version

LOG = '/var/log/erpdbcopy.log'

def psql_version():
    """Get PSQL version"""
    psql_version = os.popen('psql --version',"r")
    version = psql_version.readline().split( )[2]
    return version

def create_db_copy(user, password, dbname, port=5432):
    """Create new database_test"""

    logging.basicConfig(format='%(asctime)s %(message)s', 
        filename=LOG, level=logging.INFO)

    logging.info('Start copy database: %s' % dbname)

    logging.info('Create db copy: %s' % dbname)

    version = psql_version()

    if version < '9.2':
        process = subprocess.Popen("""
            export PGPASSWORD="erpdbcopy"
            psql postgres -U erpdbcopy --quiet -c "alter user %(user)s with superuser"
            export PGPASSWORD=%(password)s
            psql %(dbname)s -U %(user)s --quiet -c "select pg_terminate_backend(procpid) from pg_stat_activity where procpid <> pg_backend_pid( ) and datname='%(dbname)s'"
            psql %(dbname)s_test -U %(user)s --quiet -c "select pg_terminate_backend(procpid) from pg_stat_activity where procpid <> pg_backend_pid( ) and datname='%(dbname)s_test'"
            dropdb -U %(user)s %(dbname)s_test
            createdb -U %(user)s -T %(dbname)s %(dbname)s_test -O %(user)s
            export PGPASSWORD="erpdbcopy"
            psql postgres -U erpdbcopy --quiet -c "alter user %(user)s with nosuperuser"
            export PGPASSWORD=""" % {'user': user, 'password': password, 'dbname': dbname}, shell=True)
        process.wait()
    else:
        process = subprocess.Popen("""
            export PGPASSWORD="erpdbcopy"
            psql postgres -U erpdbcopy --quiet -c "alter user %(user)s with superuser"
            export PGPASSWORD=%(password)s
            psql %(dbname)s -U %(user)s --quiet -c "select pg_terminate_backend(pid) from pg_stat_activity where procpid <> pg_backend_pid( ) and datname='%(dbname)s'"
            psql %(dbname)s_test -U %(user)s --quiet -c "select pg_terminate_backend(pid) from pg_stat_activity where procpid <> pg_backend_pid( ) and datname='%(dbname)s_test'"
            dropdb -U %(user)s %(dbname)s_test
            createdb -U %(user)s -T %(dbname)s %(dbname)s_test -O %(user)s
            export PGPASSWORD="erpdbcopy"
            psql postgres -U erpdbcopy --quiet -c "alter user %(user)s with nosuperuser"
            export PGPASSWORD=""" % {'user': user, 'password': password, 'dbname': dbname}, shell=True)
        process.wait()

    try:
        logging.info('Dissable crons copy: %s_test' % dbname)
        conn = connect("dbname=%s_test user=%s password=%s port=%s" % (dbname, user, password, port))
        cur = conn.cursor()
        cur.execute("SELECT id FROM ir_cron WHERE active=True")
        rows = cur.fetchall()
        for row in rows:
            cur.execute("UPDATE ir_cron SET active = False WHERE id = %s" % row[0])
            conn.commit()

        cur.close()
        conn.close()
    except:
        logging.error('Dissable crons copy db: %s_test' % dbname)
        pass

def parse_arguments(arguments):
    parser = optparse.OptionParser(usage='erpdbcopy.py [options]', version=version.VERSION)
    parser.add_option("-u", "--user", dest="user")
    parser.add_option("-p", "--password", dest="password")
    parser.add_option("-P", "--port", dest="port")
    parser.add_option("-d", "--dbname", dest="dbname")
    (opt, _) = parser.parse_args(arguments)

    logging.basicConfig(format='%(asctime)s %(message)s', 
        filename=LOG, level=logging.INFO)

    if not opt.user:
        logging.info('Option user')
        exit()
    if not opt.password:
        logging.info('Option password')
        exit()
    if not opt.dbname:
        logging.info('Option dbname')
        exit()

    return opt

if __name__ == "__main__":
    options = parse_arguments(sys.argv)

    port = options.port
    if port is None:
        port = 5432

    create_db_copy(user=options.user, password=options.password, 
        dbname=options.dbname, port=port)

