#!/bin/bash
# modules/utils.sh - General utility functions

# Load environment file if it exists
function load_environment() {
  if [[ -f "$ENV_FILE" ]]; then
    source "$ENV_FILE"
    return 0
  else
    return 1
  fi
}

# Update or add environment variable in .env file
function update_env_var() {
  local VAR_NAME="$1"
  local VAR_VALUE="$2"
  
  if [[ -z "$VAR_NAME" || -z "$VAR_VALUE" ]]; then
    echo "${STATUS_ERROR} Error: update_env_var requires both variable name and value"
    return 1
  fi

  # Create backup
  cp "$ENV_FILE" "$ENV_FILE.bak"
  
  # Use awk for reliable text replacement
  if grep -q "^$VAR_NAME=" "$ENV_FILE"; then
    # Replace existing variable with proper quoting
    awk -v var="$VAR_NAME" -v val="$VAR_VALUE" '
      BEGIN { FS="="; OFS="=" }
      $1 == var { 
        # Quote the value if it contains spaces
        if (index(val, " ") > 0) {
          $2 = "\"" val "\""; 
        } else {
          $2 = val;
        }
        print; next 
      }
      { print }
    ' "$ENV_FILE" > "$ENV_FILE.tmp" && mv "$ENV_FILE.tmp" "$ENV_FILE"
  else
    # Append new variable with proper quoting
    if [[ "$VAR_VALUE" == *" "* ]]; then
      echo "$VAR_NAME=\"$VAR_VALUE\"" >> "$ENV_FILE"
    else
      echo "$VAR_NAME=$VAR_VALUE" >> "$ENV_FILE"
    fi
  fi
}

# Print colored output
function print_error() {
  echo -e "${COLOR_RED}${STATUS_ERROR} $1${COLOR_NC}"
}

function print_success() {
  echo -e "${COLOR_GREEN}${STATUS_SUCCESS} $1${COLOR_NC}"
}

function print_warning() {
  echo -e "${COLOR_YELLOW}${STATUS_WARNING} $1${COLOR_NC}"
}

function print_info() {
  echo -e "${COLOR_BLUE}${STATUS_INFO} $1${COLOR_NC}"
}

# Version hash management
function current_version_hash() {
  local git_commit=$(get_git_commit)
  echo "$git_commit" | sha256sum | cut -d' ' -f1
}

function save_hash() {
  current_version_hash > "$HASH_FILE"
}

function has_version_changed() {
  local NEW_HASH OLD_HASH
  NEW_HASH=$(current_version_hash)
  OLD_HASH=$(cat "$HASH_FILE" 2>/dev/null || echo "")
  [[ "$NEW_HASH" != "$OLD_HASH" ]]
}

# Cleanup function for script exit
function cleanup() {
  echo "${STATUS_STOP} Shutting down..."
  exit 0
}

# Mark deployment status in env file
function mark_deploy_status() {
  local status="$1"
  if [[ "$status" == "success" ]]; then
    update_env_var "LAST_DEPLOY_FAILED" "false"
    update_env_var "LAST_DEPLOY_DATE" "$(date '+%Y-%m-%d %H:%M:%S')"
    save_hash
  else
    update_env_var "LAST_DEPLOY_FAILED" "true"
  fi
}

# Revert version on failed deployment
function revert_version() {
  if [[ -f "$ENV_FILE.bak" ]]; then
    local OLD_VERSION
    OLD_VERSION=$(grep "^VERSION=" "$ENV_FILE.bak" | cut -d '=' -f2)
    if [[ -n "$OLD_VERSION" ]]; then
      update_env_var "VERSION" "$OLD_VERSION"
      echo "⛔️ Deployment failed. VERSION reverted to $OLD_VERSION"
    fi
  else
    print_warning "No backup file found, cannot revert version"
  fi
}