import boto3
import json
import base64
import sqlalchemy as sql
import psycopg
from botocore.exceptions import ClientError


def get_secret(secret_name):
    region_name = "eu-central-1"

    session = boto3.session.Session()
    client = session.client(
        service_name="secretsmanager",
        region_name=region_name,
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        raise e

    if "SecretString" in get_secret_value_response:
        secret = get_secret_value_response["SecretString"]
    else:
        secret = base64.b64decode(
            get_secret_value_response["SecretBinary"]
        )

    return json.loads(secret)


# ----------------------------------------------------------------------
# SQLAlchemy
# ----------------------------------------------------------------------

def create_db_connection(secret_name):
    secret = get_secret(secret_name)

    return sql.create_engine(
        f"postgresql://{secret['username']}:{secret['password']}@"
        f"{secret['host']}:{secret['port']}/{secret['dbname']}"
    )


# ----------------------------------------------------------------------
# psycopg
# ----------------------------------------------------------------------

def create_psycopg_dsn(secret_name):
    """
    Retourneert een DSN-string voor psycopg.connect()
    """
    secret = get_secret(secret_name)

    return (
        f"host={secret['host']} "
        f"port={secret['port']} "
        f"dbname={secret['dbname']} "
        f"user={secret['username']} "
        f"password={secret['password']}"
    )


def create_psycopg_connection(secret_name):
    """
    Retourneert direct een psycopg Connection.
    """
    return psycopg.connect(create_psycopg_dsn(secret_name))
    
