#!/bin/bash
set -e

# Restore the original password
ORIGINAL_PASSWORD=$(echo "${SERVERLESS_CLUSTER_PASSWORD}" | sed 's/\\\$/\$/g' | sed 's/\\\!/\!/g' | sed 's/\\\^/\^/g')

# Creating the database if it doesn't exist
echo "Creating the database if it doesn't exist..."
cat > ~/.my.cnf <<EOF
[client]
host=${SERVERLESS_CLUSTER_HOST}
port=${SERVERLESS_CLUSTER_PORT}
user='${SERVERLESS_CLUSTER_USERNAME}'
password='${ORIGINAL_PASSWORD}'
EOF

chmod 600 ~/.my.cnf

mysql -e "CREATE DATABASE IF NOT EXISTS \`${SERVERLESS_CLUSTER_DATABASE_NAME}\`;"

mkdir -p /home/ubuntu/demo_205/

# Clone the repository
echo "Cloning repository..."
TEMP_DIR=$(mktemp -d)
curl -L https://github.com/pingcap-inc/tidb-course-labs/tarball/main | tar -xz -C "${TEMP_DIR}"
REPO_DIR=$(find "${TEMP_DIR}" -maxdepth 1 -type d -name "pingcap-inc-tidb-course-labs-*" | head -n 1)
if [ -d "${REPO_DIR}/labs/demo_205/Mshop" ]; then
  cp -r "${REPO_DIR}/labs/demo_205/Mshop" /home/ubuntu/demo_205/
else
  echo "Error: Mshop directory not found in repository"
  exit 1
fi
rm -rf "${TEMP_DIR}"

# Write .env file
cat > /home/ubuntu/demo_205/Mshop/.env <<EOF
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:UyFrMdp9tPRpq5jpEd7l2B4RtwEgRXE/9sBz9clB9b4=
APP_DEBUG=true
APP_URL=http://127.0.0.1:8000
URL_PREFIX=/vscode/proxy/8000

APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US

APP_MAINTENANCE_DRIVER=file

LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

# Aurora (MySQL)
DB_CONNECTION=mysql
DB_PORT=3306
DB_HOST=${AWS_AURORA_SERVERLESS_ENDPOINT}
DB_USERNAME=${AWS_AURORA_SERVERLESS_MASTER_USERNAME}
DB_PASSWORD=${AWS_AURORA_SERVERLESS_MASTER_PASSWORD}
DB_DATABASE=${SERVERLESS_CLUSTER_DATABASE_NAME}

# tidb cloud cluster
# DB_CONNECTION=mysql
# DB_PORT=${SERVERLESS_CLUSTER_PORT}
# DB_HOST=${SERVERLESS_CLUSTER_HOST}
# DB_USERNAME='${SERVERLESS_CLUSTER_USERNAME}'
# DB_PASSWORD='${ORIGINAL_PASSWORD}'
# DB_DATABASE=${SERVERLESS_CLUSTER_DATABASE_NAME}
# MYSQL_ATTR_SSL_CA="/etc/ssl/certs/ca-certificates.crt"

SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null

FILESYSTEM_DISK=local
CACHE_STORE=database
EOF

# Change to the working directory
cd /home/ubuntu/demo_205

# Create docker-compose.yml in Mshop directory
echo "Creating docker-compose.yml in Mshop directory..."
cat > ./Mshop/docker-compose.yml <<EOF
version: "3.9"

services:
  tidb-lab:
    image: chenhaoh/tidb-lab-php-vscode:v5.0
    container_name: tidb-lab
    ports:
      - "3000:8080"
      - "8000:8000"
      - "8501:8501"
      - "5173:5173"
      - "8502:8502"
    environment:
      SERVERLESS_CLUSTER_HOST: ${SERVERLESS_CLUSTER_HOST}
      SERVERLESS_CLUSTER_PORT: ${SERVERLESS_CLUSTER_PORT}
      SERVERLESS_CLUSTER_USERNAME: '${SERVERLESS_CLUSTER_USERNAME}'
      SERVERLESS_CLUSTER_PASSWORD: ${ORIGINAL_PASSWORD}
      SERVERLESS_CLUSTER_DATABASE_NAME: ${SERVERLESS_CLUSTER_DATABASE_NAME}
      SERVERLESS_CLUSTER_ID: ${SERVERLESS_CLUSTER_ID}
      AWS_AURORA_SERVERLESS_CLUSTER_IDENTIFIER: ${AWS_AURORA_SERVERLESS_CLUSTER_IDENTIFIER}
      AWS_AURORA_SERVERLESS_INSTANCE_IDENTIFIER: ${AWS_AURORA_SERVERLESS_INSTANCE_IDENTIFIER}
      AWS_AURORA_SERVERLESS_PORT: ${AWS_AURORA_SERVERLESS_PORT}
      AWS_AURORA_SERVERLESS_ENDPOINT: ${AWS_AURORA_SERVERLESS_ENDPOINT}
      AWS_AURORA_SERVERLESS_READER_ENDPOINT: ${AWS_AURORA_SERVERLESS_READER_ENDPOINT}
      AWS_AURORA_SERVERLESS_DATABASE_NAME: ${AWS_AURORA_SERVERLESS_DATABASE_NAME}
      AWS_AURORA_SERVERLESS_MASTER_USERNAME: ${AWS_AURORA_SERVERLESS_MASTER_USERNAME}
      AWS_AURORA_SERVERLESS_MASTER_PASSWORD: ${AWS_AURORA_SERVERLESS_MASTER_PASSWORD}
    command: ["code-server", "--host", "0.0.0.0", "--port", "8080", "--disable-workspace-trust"]
    volumes:
      - /home/ubuntu/demo_205/Mshop:/root/Mshop
    networks:
      - lab-net

networks:
  lab-net:
    driver: bridge
EOF

# Start the VS Code container
cd Mshop/
docker compose up -d

# Create prepare.sh in Mshop directory
echo "Creating prepare_shop.sh in Mshop directory..."
cat > ./prepare_shop.sh <<EOF
#!/bin/bash

# ==============================================================================
# Linux Deployment Script for Ubuntu
# Author: Senior Linux Engineer
# Description: Automates the setup of the shop application stack.
# ==============================================================================

# ------------------------------------------------------------------------------
# Configuration & Colors
# ------------------------------------------------------------------------------
# Define color codes for elegant output
GREEN='\033[0;32m'
RED='\033[0;31m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# ------------------------------------------------------------------------------
# Helper Function
# ------------------------------------------------------------------------------
# Arguments:
#   \$1: The command string to execute
function run_step {
    local cmd="\$1"

    echo -e "\${CYAN}[INFO] Executing: \${cmd} ...\${NC}"

    # Execute the command. 'eval' is used to handle redirects (e.g., mysql < file)
    eval "\$cmd"

    # Check the exit status of the last command
    if [ \$? -eq 0 ]; then
        echo -e "\${GREEN}[SUCCESS] Command completed successfully.\${NC}"
        echo "------------------------------------------------------------"
        sleep 1
    else
        echo -e "\${RED}[ERROR] Command failed. Aborting script.\${NC}"
        exit 1
    fi
}

# ------------------------------------------------------------------------------
# Main Execution Flow
# ------------------------------------------------------------------------------

echo "Starting deployment process..."
echo "------------------------------------------------------------"

# 1. Install PHP dependencies
run_step "composer install"

# 2. Install Node.js dependencies
run_step "npm install"

# 3. Drop database if it exists
run_step "mysql -h ${AWS_AURORA_SERVERLESS_ENDPOINT} -u ${AWS_AURORA_SERVERLESS_MASTER_USERNAME} -p${AWS_AURORA_SERVERLESS_MASTER_PASSWORD} -P${AWS_AURORA_SERVERLESS_PORT} -e 'DROP DATABASE IF EXISTS ${SERVERLESS_CLUSTER_DATABASE_NAME};'"

# 4. Create database if it doesn't exist
run_step "mysql -h ${AWS_AURORA_SERVERLESS_ENDPOINT} -u ${AWS_AURORA_SERVERLESS_MASTER_USERNAME} -p${AWS_AURORA_SERVERLESS_MASTER_PASSWORD} -P${AWS_AURORA_SERVERLESS_PORT} -e 'CREATE DATABASE IF NOT EXISTS ${SERVERLESS_CLUSTER_DATABASE_NAME};'"

# 5. Run database migrations
run_step "php artisan migrate"

# 6. Import initial database schema
# Note: Ensure 'initshop.sql' exists in the current directory
run_step "mysql -h ${AWS_AURORA_SERVERLESS_ENDPOINT} -u ${AWS_AURORA_SERVERLESS_MASTER_USERNAME} -p${AWS_AURORA_SERVERLESS_MASTER_PASSWORD} -P${AWS_AURORA_SERVERLESS_PORT} ${SERVERLESS_CLUSTER_DATABASE_NAME} < initshop.sql"

# 7. Require specific image processing library
run_step "composer require intervention/image:^2"

# 8. Clear configuration cache
run_step "php artisan config:clear"

# 9. Dump autoloader to optimize classes
run_step "composer dump-autoload"

# 10. Create symbolic link for storage
run_step "php artisan storage:link"

echo -e "\${GREEN}>>> All tasks completed successfully! <<<\${NC}"
EOF
