import logging
import os
import boto3
import json

logger = logging.getLogger(__name__)
__version__ = "0.0.1"

rds_data = boto3.client('rds-data')


def on_create(event, context, secret_arn, cluster_arn):
    physical_id = 'initPostgresql'
    rds_data.execute_statement(
        secretArn=secret_arn,
        database='postgres',
        resourceArn=cluster_arn,
        sql=
        "CREATE TABLE if not exists textractcsvimport (createtime timestamp, classification varchar(512), \
        filename text, \
        page decimal(10), \
        key text, \
        key_confidence varchar(25), \
        value text, \
        value_confidence varchar(25), \
        key_bb_top varchar(25), \
        key_bb_height varchar(25), \
        k_bb_width varchar(25), \
        k_bb_left varchar(25), \
        v_bb_top varchar(25), \
        v_bb_height varchar(25), \
        v_bb_width varchar(25), \
        v_bb_left varchar(25));"

        #     page_number, key_name, key_confidence, value_name, value_confidence, key-bounding-box.top, key-bounding-box.height, k-bb.width, k-bb.left, value-bounding-box.top, v-bb.height, v-bb.width, v-bb.left
    )
    return { 'PhysicalResourceId': physical_id }


def on_update(event, context, secret_arn, cluster_arn):
    physical_id = 'initPostgresql'
    rds_data.execute_statement(
        secretArn=secret_arn,
        database='postgres',
        resourceArn=cluster_arn,
        sql=
        "CREATE TABLE if not exists textractcsvimport (createtime timestamp, classification varchar(512), \
        filename text, \
        page decimal(10), \
        key text, \
        key_confidence varchar(25), \
        value text, \
        value_confidence varchar(25), \
        key_bb_top varchar(25), \
        key_bb_height varchar(25), \
        k_bb.width varchar(25), \
        k_bb_left varchar(25), \
        v_bb_top varchar(25), \
        v_bb_height varchar(25), \
        v_bb_width varchar(25), \
        v_bb_left varchar(25));"

        #     page_number, key_name, key_confidence, value_name, value_confidence, key-bounding-box.top, key-bounding-box.height, k-bb.width, k-bb.left, value-bounding-box.top, v-bb.height, v-bb.width, v-bb.left
    )
    print("update resource %s with props %s" % (physical_id))


def on_delete(event, context):
    physical_id = 'initPostgresql'
    print("delete resource %s" % physical_id)

def lambda_handler(event, context):
    log_level = os.environ.get('LOG_LEVEL', 'INFO')
    logger.setLevel(log_level)
    logger.info(json.dumps(event))
    logger.debug(f"version: {__version__}")
    logger.debug(f"boto3 version: {boto3.__version__}")
    logger.info(event)
    cluster_arn = os.environ.get('CLUSTER_ARN', '')
    secret_arn = os.environ.get('SECRET_ARN', '')
    logger.info(f'SECRET_ARN: {secret_arn}\nCLUSTER_ARN: {cluster_arn}')
    if not secret_arn:
        raise ValueError(f'no SECRET_ARN defined: {secret_arn}')
    if not cluster_arn:
        raise ValueError(f'no CLUSTER_ARN defined: {cluster_arn}')
    request_type = event['RequestType'].lower()
    if request_type == 'create':
        return on_create(event=event,
                         context=context,
                         cluster_arn=cluster_arn,
                         secret_arn=secret_arn)
    if request_type == 'update':
        return on_update(event=event,
                         context=context,
                         cluster_arn=cluster_arn,
                         secret_arn=secret_arn)
    if request_type == 'delete':
        return on_delete(event=event, context=context)
    raise Exception(f'Invalid request type: {request_type}')