#!/usr/bin/env bash
set -euo pipefail

# ==========================================
# Helper Functions
# ==========================================

LINE_WIDTH=60

section() {
  local title="$1"
  printf "\n%s\n" "$(printf '═%.0s' $(seq 1 $LINE_WIDTH))"
  printf "  🚀 %s\n" "$title"
  printf "%s\n\n" "$(printf '═%.0s' $(seq 1 $LINE_WIDTH))"
}

show_changes_tree() {
  echo
  echo "📦 Changed Files To Upload"
  printf '%s\n' "$(printf '─%.0s' $(seq 1 $LINE_WIDTH))"

  CHANGED_FILES=$(git diff --name-only HEAD -- app config resources routes || true)

  if [[ -z "$CHANGED_FILES" ]]; then
    echo "✅ No changed files detected"
    echo
    return
  fi

  echo "project-root"

  echo "$CHANGED_FILES" | sort | while read -r file; do
    IFS='/' read -ra PARTS <<< "$file"

    indent=""

    for ((i=0; i<${#PARTS[@]}-1; i++)); do
      if [[ $i -eq 0 ]]; then
        echo "├── ${PARTS[$i]}"
      else
        indent="${indent}│   "
        echo "${indent}├── ${PARTS[$i]}"
      fi
    done

    echo "${indent}│   └── ${PARTS[-1]}"
  done

  echo
}

# ==========================================
# Dependency Check
# ==========================================

if ! command -v lftp &> /dev/null; then
  echo "❌ lftp is not installed."
  echo "Install with:"
  echo "sudo apt install lftp"
  exit 1
fi

if ! command -v git &> /dev/null; then
  echo "❌ git is not installed."
  exit 1
fi

# ==========================================
# Confirm
# ==========================================

section "Laravel Partial Deployment"

show_changes_tree

read -p "Deploy changed files to production? [y/N] " -n 1 -r
echo

if [[ ! $REPLY =~ ^[Yy]$ ]]; then
  echo "❌ Cancelled"
  exit 1
fi

# ==========================================
# Paths
# ==========================================

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="$SCRIPT_DIR/.env"

# ==========================================
# Load ENV
# ==========================================

get_env() {
  VAR_NAME="$1"

  grep -m1 "^$VAR_NAME=" "$ENV_FILE" \
    | cut -d '=' -f2- \
    | sed -E 's/^["'"'"']?(.*?)["'"'"']?$/\1/'
}

FTP_HOST=$(get_env FTP_HOST)
FTP_PORT=$(get_env FTP_PORT)
FTP_USER=$(get_env FTP_USER)
FTP_PASS=$(get_env FTP_PASS)
FTP_REMOTE_DIR=$(get_env FTP_REMOTE_DIR)

FTP_PORT="${FTP_PORT:-21}"
REMOTE_DIR="${FTP_REMOTE_DIR:-.}"

if [[ -z "$FTP_HOST" || -z "$FTP_USER" || -z "$FTP_PASS" ]]; then
  echo "❌ Missing FTP credentials in .env"
  exit 1
fi

# ==========================================
# Upload app/
# ==========================================

section "Syncing app/"

lftp -u "$FTP_USER","$FTP_PASS" -p "$FTP_PORT" "$FTP_HOST" <<EOF
set ftp:ssl-allow no

mirror --reverse \
  --verbose \
  --delete \
  --only-newer \
  "$SCRIPT_DIR/app" "$REMOTE_DIR/app"

bye
EOF

# ==========================================
# Upload config/
# ==========================================

section "Syncing config/"

lftp -u "$FTP_USER","$FTP_PASS" -p "$FTP_PORT" "$FTP_HOST" <<EOF
set ftp:ssl-allow no

mirror --reverse \
  --verbose \
  --delete \
  --only-newer \
  "$SCRIPT_DIR/config" "$REMOTE_DIR/config"

bye
EOF

# ==========================================
# Upload resources/
# ==========================================

section "Syncing resources/"

lftp -u "$FTP_USER","$FTP_PASS" -p "$FTP_PORT" "$FTP_HOST" <<EOF
set ftp:ssl-allow no

mirror --reverse \
  --verbose \
  --delete \
  --only-newer \
  "$SCRIPT_DIR/resources" "$REMOTE_DIR/resources"

bye
EOF

# ==========================================
# Upload routes/
# ==========================================

section "Syncing routes/"

lftp -u "$FTP_USER","$FTP_PASS" -p "$FTP_PORT" "$FTP_HOST" <<EOF
set ftp:ssl-allow no

mirror --reverse \
  --verbose \
  --delete \
  --only-newer \
  "$SCRIPT_DIR/routes" "$REMOTE_DIR/routes"

bye
EOF

# ==========================================
# Finish
# ==========================================

section "✅ Partial Laravel Deployment Completed"