#!/usr/bin/python3
import argparse
import os
import random
import string
import subprocess
import sys


publik = {
    'authentic2-multitenant': {
        'database': 'authentic2_multitenant',
        'user': 'authentic-multitenant',
        'extensions': ['unaccent', 'pg_trgm'],
    },
    'bijoe': {},
    'chrono': {},
    'combo': {'extensions': ['unaccent']},
    'fargo': {},
    'hobo': {},
    'passerelle': {},
    'wcs': {},
    'welco': {},
}


def run(command, database='postgres', fake=False):
    cmd = 'sudo -u postgres psql -c "%s" %s' % (command.replace('"', '\\"'), database)
    if fake:
        print(cmd)
    else:
        subprocess.run(cmd, shell=True, check=True)


def write_setting(brique, host, port, password):
    if brique == 'wcs':
        print('warning: setting w.c.s. connection password is not implemented')
        return
    settings_d = '/etc/%s/settings.d' % brique
    settings = '%s/database.py' % settings_d
    if not os.path.isdir(settings_d):
        os.system('mkdir -p %s' % settings_d)
    with open(settings, 'w') as fh:
        fh.write(
            "DATABASES['default']['HOST'] = '{host}'\n"
            "DATABASES['default']['PORT'] = {port}\n"
            "DATABASES['default']['PASSWORD'] = '{password}'".format(host=host, port=port, password=password)
        )


def main(args):
    for brique, data in publik.items():
        database = data.get('database', brique)
        user = data.get('user', brique)
        extensions = data.get('extensions')
        run('CREATE USER "%s";' % user, fake=args.fake)
        if user == 'wcs':
            run('ALTER USER wcs CREATEDB;', fake=args.fake)
        if args.password:
            password = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(16))
            run("ALTER USER \"%s\" with password '%s';" % (user, password), fake=args.fake)
        run(
            "CREATE DATABASE {} WITH OWNER = \"{}\" TEMPLATE = template0 "
            "LC_COLLATE = 'fr_FR.UTF-8' LC_CTYPE = 'fr_FR.UTF-8';".format(database, user),
            fake=args.fake,
        )
        if extensions:
            for e in extensions:
                run('CREATE EXTENSION %s;' % e, database=database, fake=args.fake)
        if not args.fake and args.password:
            write_setting(brique, args.host, args.port, password)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--password', action='store_true', help='generate password')
    parser.add_argument('--fake', action='store_true', help='dry-run')
    parser.add_argument('--host', default='localhost')
    parser.add_argument('--port', default='5432')
    args = parser.parse_args()

    if not args.fake and os.geteuid() != 0:
        sys.exit('You need to have privileges to run this script, please try again with sudo.')

    main(args)
