#!/bin/bash

# Print error message and exit with code 1
# Usage: die "error message"
die() {
    echo -e "\033[91mError: $1\033[0m"
    exit 1
}

# Load environment variables from .env file
# Usage: load_env [path_to_env_file]
# If no path is provided, looks for .env in the same directory as the script
load_env() {
    local script_dir="$(dirname "${BASH_SOURCE[0]}")"
    local env_file
    
    if [ -z "$1" ]; then
        echo "Usage: $0 [path_to_env_file]"
        return 1
    else
        # If path is relative, make it absolute using script directory as base
        if [[ "$1" != /* ]]; then
            env_file="$script_dir/$1"
        else
            env_file="$1"
        fi
    fi
    
    if [ -f "$env_file" ]; then
        set -a
        source "$env_file"
        set +a
    else
        echo "Warning: .env file not found at $env_file"
        return 1
    fi
}

grey_start() {
    echo -e -n "\033[90m"
}

grey_end() {
    echo -e -n "\033[0m"
}

# Test if Docker is installed and working on the local machine
# Returns 0 if Docker is working, 1 if there are any issues
test_docker() {
    echo "Testing Docker on local machine..."

    # Test Docker installation
    if ! command -v docker >/dev/null 2>&1; then
        die "Docker is not installed on this machine"
    fi

    # Test Docker daemon is running
    if ! docker info >/dev/null 2>&1; then
        die "Docker daemon is not running"
    fi

    # Test Docker can run containers
    if ! docker run --rm hello-world >/dev/null 2>&1; then
        die "Docker cannot run containers"
    fi

    echo "Docker is working correctly on local machine"
    return 0
}


start_container() {
    # Check if container exists and is stopped
    echo "Checking container status..."
    if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
        if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
            die "Container ${CONTAINER_NAME} is already running"
        else
            echo "Starting existing container ${CONTAINER_NAME}..."
            grey_start
            if ! docker start "${CONTAINER_NAME}"; then
                die "Failed to start container ${CONTAINER_NAME}"
            fi
            grey_end
        fi
    else
        echo "Creating and starting new container ${CONTAINER_NAME}..."
        grey_start
        docker run -d \
            --restart unless-stopped \
            --name ${CONTAINER_NAME} \
            -p ${HOST_PORT}:${CONTAINER_PORT} \
            -v ${DATA_FOLDER}:/skdata \
            ${IMAGE_REGISTRY}/${IMAGE_REPO}:${IMAGE_TAG}
        grey_end
    fi

    # check if the container is running
    if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
        die "Container ${CONTAINER_NAME} is not running"
    fi

    # print the container id
    ID=$(docker ps --format '{{.ID}}' --filter "name=^${CONTAINER_NAME}$")
    echo "Container ${CONTAINER_NAME} is running with ID ${ID}"

    return 0
}

stop_container() {
    # Check if container is running
    echo "Checking if container is running..."
    if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
        echo "Stopping container ${CONTAINER_NAME}..."
        grey_start
        if ! docker stop "${CONTAINER_NAME}"; then
            die "Failed to stop container ${CONTAINER_NAME}"
        fi
        grey_end
        echo "Container ${CONTAINER_NAME} stopped successfully"
        return 0
    else
        echo "Container ${CONTAINER_NAME} is not running"
        return 1
    fi
}