#!/usr/bin/env python3

import os, sys, argparse, logging

logging.basicConfig(
    level=logging.DEBUG,
    format="%(levelname)-8s: %(message)s",
    datefmt='%Y-%m-%d %I:%M:%S')

workdir='/tmp/cr'

try:
    os.mkdir(workdir)
except FileExistsError:
    pass

ora_init = """\
db_block_size=8192
open_cursors={args.cursors}
db_domain=''
db_name='{dbname}'
control_files=('{args.cdest}/{dbupper}/control1.ctl', '{args.tdest}/{dbupper}/control2.ctl')
db_create_file_dest='{args.cdest}'
log_archive_dest_1='LOCATION=+FRA'
compatible='19.0.0.0.0'
diagnostic_dest='/u01/app/oracle'
filesystemio_options=SETALL
processes={args.processes}
sga_target={args.sga}M
pga_aggregate_target={args.pga}
audit_file_dest='/u01/app/oracle/admin/{dbname}/adump'
audit_trail=none
remote_login_passwordfile=EXCLUSIVE
undo_tablespace=UNDOTBS1
"""

ora_create = """\
CREATE DATABASE {dbname}
USER SYS IDENTIFIED BY {dbpass}
USER SYSTEM IDENTIFIED BY {dbpass}
MAXINSTANCES 3
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 1024
EXTENT MANAGEMENT LOCAL
DATAFILE                                   '{args.cdest}' SIZE {args.systemsize}M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
SYSAUX DATAFILE                            '{args.cdest}' SIZE {args.sysauxsize}M AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '{args.tdest}' SIZE {args.tempsize}M AUTOEXTEND ON NEXT   640K MAXSIZE UNLIMITED
UNDO TABLESPACE undotbs01  DATAFILE        '{args.cdest}' SIZE {args.undosize}M AUTOEXTEND ON NEXT  5120K MAXSIZE UNLIMITED
-- USER_DATA TABLESPACE USERS    DATAFILE  '{args.cdest}' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
"""

ora_create_tail = """\
CHARACTER SET WE8MSWIN1252
NATIONAL CHARACTER SET AL16UTF16
SET DEFAULT BIGFILE TABLESPACE
LOGFILE
	GROUP 1 ('{args.rdest}') SIZE {args.redosize}M,
	GROUP 2 ('{args.rdest}') SIZE {args.redosize}M,
	GROUP 3 ('{args.rdest}') SIZE {args.redosize}M
/
"""

ora_cdb = """\
ENABLE PLUGGABLE DATABASE
	SEED
	FILE_NAME_CONVERT = (
	'{args.cdest}/{dbupper}/system01.dbf','{args.cdest}/{dbupper}/seed/system01.dbf',
	'{args.cdest}/{dbupper}/sysaux01.dbf','{args.cdest}/{dbupper}/seed/sysaux01.dbf',
	'{args.tdest}/{dbupper}','{args.tdest}/{dbupper}/seed/temp01.dbf'
	)
	SYSTEM DATAFILES SIZE 32M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
	SYSAUX DATAFILES SIZE 32M
"""

catalog_11g = """\
SPOOL /tmp/$ORACLE_SID/catalog.log append
@?/rdbms/admin/catalog.sql;
@?/rdbms/admin/catproc.sql;
-- @?/rdbms/admin/catoctk.sql;
@?/rdbms/admin/catblock.sql;
-- @?/rdbms/admin/owminst.plbl;
connect SYSTEM/${dbpass}
@?/sqlplus/admin/pupbld.sql;
"""

def makefiles(args):
    try:
        orahome = os.environ['ORACLE_HOME']
    except KeyError:
        logging.error('ORACLE_HOME not set')
        sys.exit(10)

    dbname   = args.dbname
    dbpass   = 'foobar#12'
    dbupper  = dbname.upper()
    #os.makedirs('/u01/app/oracle/admin/demo/adump', exist_ok=True)
    with open(os.path.join(workdir,'pre.sql'),'w') as f:
        f.write(f"alter diskgroup {args.cdest} add directory '+{args.cdest}/{dbupper}';")

    with open(os.path.join(workdir,'init.ora'),'w') as f:
        f.write(ora_init.format(**locals()))

    with open(os.path.join(workdir,'create.sql'),'w') as f:
        f.write(ora_create.format(**locals()))
        if args.container:
            f.write(ora_cdb.format(**locals()))

        f.write(ora_create_tail.format(**locals()))

    with open(os.path.join(workdir,'catalog.sql'),'w') as f:
        f.write(catalog_11g.format(**locals()))

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(      "--container",  help="Container DB",         action="store_true")
    parser.add_argument(      "--createdest", help="db_create_file_dest",  type=str, default='+DATA', dest='cdest')
    parser.add_argument(      "--tempdest",   help="TEMP dest",            type=str, default='+TEMP', dest='tdest')
    parser.add_argument(      "--redodest",   help="REDO dest",            type=str, default='+REDO', dest='rdest')
    parser.add_argument(      "--systemsize", help="SYSTEM datafile size", type=int, default=300)
    parser.add_argument(      "--sysauxsize", help="SYSAUX datafile size", type=int, default=400)
    parser.add_argument(      "--tempsize",   help="TEMP datafile size",   type=int, default=100)
    parser.add_argument(      "--undosize",   help="UNDO datafile size",   type=int, default=128)
    parser.add_argument(      "--redosize",   help="REDO logfile size",    type=int, default=64)
    parser.add_argument(      "--sga",        help="SGA Size",             type=int, default=768)
    parser.add_argument(      "--pga",        help="PGA Size",             type=int, default=256)
    parser.add_argument(      "--processes",  help="Processes",            type=int, default=300)
    parser.add_argument(      "--cursors",    help="Cursors",              type=int, default=300)
    parser.add_argument(      "dbname",       help="name",                 type=str) # , nargs='?')
    args = parser.parse_args()

    makefiles(args)
