#!/bin/bash

SCRIPT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

logger() {
    python3 $SCRIPT_PATH/logger.py "$1" "$2"
}

setup_mysql() {
    logger "info" "Starting MySQL Docker container...."
    
    containerId=$(docker run -d --name $CONTAINER_NAME -p $MYSQL_HOST:$MYSQL_PORT:3306 -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD mysql:latest)
    
    if [ $? -eq 0 ]; then
        logger "info" "MySQL Docker container started with id: $containerId."
        logger "info" "Waiting 10s for MySQL Docker container to start...."
        sleep 10
    else
        logger "error" "Failed to start MySQL Docker container."
    fi
    
    # Check if the MySQL container is running
    if docker ps | grep "$CONTAINER_NAME" &>/dev/null; then
        
        QUERIES=("CREATE DATABASE $CONTAINER_NAME;"
            "CREATE USER '$MYSQL_USER'@'localhost' IDENTIFIED BY '$MYSQL_PASSWORD';"
            "GRANT ALL PRIVILEGES ON $CONTAINER_NAME.* TO '$MYSQL_USER'@'localhost';"
        "FLUSH PRIVILEGES;")
        
        logger "info" "Creating MySQL user and database...."
        
        for query in "${QUERIES[@]}";
        do
            docker exec -it $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "$query" &>/dev/null;
            
        done
        
        logger "info" "MySQL user -> '$MYSQL_USER' created succesfully."
        logger "info" "MySQL database -> '$CONTAINER_NAME' created succesfully."
        
    else
        logger "error" "MySQL container is not running."
        exit 1
    fi
}

setup_postgresql() {
    logger "info" "Starting PostgreSQL Docker container...."
    
    containerId=$(docker run -d --name $CONTAINER_NAME -p $POSTGRESQL_HOST:$POSTGRESQL_PORT:5432 -e POSTGRES_PASSWORD=$POSTGRESQL_PASSWORD postgres:latest)
    
    if [ $? -eq 0 ]; then
        logger "info" "PostgreSQL Docker container started with id: $containerId."
        logger "info" "Waiting 10s for PostgreSQL Docker container to start...."
        sleep 10
    else
        logger "error" "Failed to start PostgreSQL Docker container."
        exit 1
    fi
    
    # Check if the PostgreSQL container is running
    if docker ps | grep "$CONTAINER_NAME" &>/dev/null; then
        
        QUERIES=("CREATE DATABASE $CONTAINER_NAME;"
            "CREATE USER $POSTGRESQL_USER WITH ENCRYPTED PASSWORD '$POSTGRESQL_PASSWORD';"
            "ALTER ROLE $POSTGRESQL_USER SET client_encoding TO 'utf8';"
            "ALTER ROLE $POSTGRESQL_USER SET default_transaction_isolation TO 'read committed';"
            "ALTER ROLE $POSTGRESQL_USER SET timezone TO 'UTC';"
            "GRANT CREATE, TEMP, CONNECT ON DATABASE $CONTAINER_NAME TO $POSTGRESQL_USER;"
        )
        
        logger "info" "Creating PostgreSQL user and database...."
        
        for query in "${QUERIES[@]}"; do
            docker exec -it $CONTAINER_NAME psql -U postgres -c "$query" &>/dev/null;
        done
        
        # Grant for public
        docker exec -it $CONTAINER_NAME psql -U postgres $CONTAINER_NAME -c "GRANT ALL ON SCHEMA public TO $POSTGRESQL_USER;" &>/dev/null;
        
        logger "info" "PostgreSQL user -> '$POSTGRESQL_USER' created successfully."
        logger "info" "PostgreSQL database -> '$CONTAINER_NAME' created successfully."
        
    else
        logger "error" "PostgreSQL container is not running."
        exit 1
    fi
}


setup_cassandra() {
    exit 1
}

setup_scylla() {
    exit 1
}


check_docker() {
    if command -v docker &>/dev/null; then
        if [ "$DATABASE_TYPE" == 'mysql' ]; then
            setup_mysql
            
            elif [ "$DATABASE_TYPE" == 'postgre' ]; then
            setup_postgresql
            
            elif [ "$DATABASE_TYPE" == 'cassandra' ]; then
            setup_cassandra
            
            elif [ "$DATABASE_TYPE" == 'scylla' ]; then
            setup_scylla
        fi
    else
        logger "error" "Docker is not installed."
        exit 1
    fi
}

# Activate the virtual environment
if source "$SCRIPT_PATH/activate"; then
    logger "info" "Virtual environment activated successfully."
else
    echo "Failed to activate the virtual environment."
    exit 1
fi

check_docker

