#!/bin/bash

set -euo pipefail  # Strict mode: exit on error, undefined vars, pipe failures

# Get the directory where this script is actually located (resolve symlinks)
SCRIPT_PATH="${BASH_SOURCE[0]}"
echo "SCRIPT PATH:", $SCRIPT_PATH
# Follow symlinks to get the real script location
while [[ -L "$SCRIPT_PATH" ]]; do
    SCRIPT_DIR="$(cd -P "$(dirname "$SCRIPT_PATH")" && pwd)"
    SCRIPT_PATH="$(readlink "$SCRIPT_PATH")"
    # Handle relative symlinks
    [[ "$SCRIPT_PATH" != /* ]] && SCRIPT_PATH="$SCRIPT_DIR/$SCRIPT_PATH"
done
SCRIPT_DIR="$(cd -P "$(dirname "$SCRIPT_PATH")" && pwd)"

echo "SCRIPT_DIR", $SCRIPT_DIR
# The .env file should be one directory up from the scripts directory
DEPLOY_DIR="$(dirname "$SCRIPT_DIR")"
ENV_FILE="$DEPLOY_DIR/.env"

echo "ENV_FILE", $ENV_FILE

if [[ ! -f "$ENV_FILE" ]]; then
    echo "Error: .env file not found at $ENV_FILE"
    echo "Expected script location: glockenspiel/suno_orpheus/scripts/"
    exit 1
fi

# Read GLOCKENSPIEL_ROOT from .env file
if ! grep -q "GLOCKENSPIEL_ROOT" "$ENV_FILE"; then
    echo "Error: GLOCKENSPIEL_ROOT not found in $ENV_FILE"
    exit 1
fi

GLOCKENSPIEL_ROOT=$(grep "GLOCKENSPIEL_ROOT" "$ENV_FILE" | cut -d'=' -f2 | tr -d '"' | tr -d "'")
if [[ -z "$GLOCKENSPIEL_ROOT" ]]; then
    echo "Error: GLOCKENSPIEL_ROOT is empty in $ENV_FILE"
    exit 1
fi

# Verify the path structure makes sense
EXPECTED_DEPLOY_DIR="$GLOCKENSPIEL_ROOT/suno_orpheus"
if [[ ! -d "$EXPECTED_DEPLOY_DIR" ]]; then
    echo "Error: Expected directory $EXPECTED_DEPLOY_DIR does not exist"
    echo "Check GLOCKENSPIEL_ROOT value in $ENV_FILE"
    exit 1
fi

SETTINGS_FILE="$DEPLOY_DIR/suno_orpheus/config/settings.py"

# Determine deployment target from argument
case "${1:-}" in
    "")
        TARGET="test"
        EXPECTED_STRING="test"
        ;;
    "dev")
        TARGET="dev"
        EXPECTED_STRING="dev"
        ;;
    "prod")
        TARGET="prod"
        EXPECTED_STRING="prod"
        ;;
    *)
        echo "Error: Invalid argument. Use 'deplorpheus', 'deplorpheus dev', or 'deplorpheus prod'"
        exit 1
        ;;
esac

# Check if DEPLOYMENT_TYPE contains the expected string
DEPLOYMENT_TYPE=$(grep "DEPLOYMENT_TYPE" "$SETTINGS_FILE" | head -1)
if [[ ! "$DEPLOYMENT_TYPE" == *"$EXPECTED_STRING"* ]]; then
    echo "Error: DEPLOYMENT_TYPE in $SETTINGS_FILE does not contain '$EXPECTED_STRING'"
    echo "Current setting: $DEPLOYMENT_TYPE"
    echo "Cannot deploy $TARGET environment with current configuration."
    exit 1
fi

# Special confirmation for prod deployment
if [[ "$TARGET" == "prod" ]]; then
    echo "You are about to deploy to PRODUCTION."
    echo "Please type exactly 'I want to deploy prod' to continue:"
    read -r confirmation
    if [[ "$confirmation" != "I want to deploy prod" ]]; then
        echo "Production deployment cancelled."
        exit 1
    fi
fi

# Save current directory and switch to deploy directory
ORIGINAL_DIR=$(pwd)
if [[ "$ORIGINAL_DIR" != "$DEPLOY_DIR" ]]; then
    echo "Switching to deploy directory: $DEPLOY_DIR"
    cd "$DEPLOY_DIR"
fi

# Run the deployment command
echo "Deploying $TARGET environment..."
uv run modal deploy suno_orpheus/worker/modal_runner_orpheus.py

# Return to original directory if we changed it
if [[ "$ORIGINAL_DIR" != "$DEPLOY_DIR" ]]; then
    echo "Returning to original directory: $ORIGINAL_DIR"
    cd "$ORIGINAL_DIR"
fi

echo "Deployment of $TARGET environment completed successfully!"
