#!/usr/bin/env bash
#
# deploy.sh — Deploy App Main-Updater to production (Windows XAMPP or Listara Linux)
#
# Usage:
#   ./deploy.sh              Full deploy → Listara (deploy/deploy.conf.listara)
#   DEPLOY_CONFIG=deploy/deploy.conf.windows ./deploy.sh   Deploy to Windows (legacy)
#   ./deploy.sh deploy       Same as above
#   ./deploy.sh dry-run      Preview changes without writing to server
#   ./deploy.sh build        Build only (composer + npm)
#   ./deploy.sh setup-ssh    Generate SSH key + show Windows setup steps
#   ./deploy.sh test-ssh     Verify SSH and rsync on production
#   ./deploy.sh migrate      Run Laravel migrations on production only
#   ./deploy.sh db-sync      Sync reference tables (categories, cities, menus, etc.) — deploy.conf
#   ./deploy.sh db-replace /path/to/listara.sql   Replace COMPLET DB producție cu dump local
#   ./deploy.sh verify       Check production files, deploy marker, migrations
#   ./deploy.sh verify-listara  Verifică că deploy trimite către listara.online
#   ./deploy.sh cache        optimize:clear + config/route/view cache + cache:warm + diagnostics
#   ./deploy.sh cdn-sync     Upload CSS/JS to CDN/S3 on production (if storage active)
#   ./deploy.sh setup-autostart  Windows: XAMPP + Laravel scheduler at boot (run once on server)
#   ./deploy.sh help
#
# First-time setup (Listara):
#   1. cp deploy/deploy.conf.listara.example deploy/deploy.conf.listara
#   2. Edit deploy/deploy.conf.listara (REMOTE_DB_PASSWORD from server)
#   3. ./deploy.sh setup-ssh
#   4. ssh-keyscan -p 22 listara.online >> deploy/keys/known_hosts
#   5. Add deploy/keys/deploy_ed25519.pub to root@listara authorized_keys
#   6. ./deploy.sh test-ssh  (with DEPLOY_CONFIG=deploy/deploy.conf.listara)
#   7. DEPLOY_CONFIG=deploy/deploy.conf.listara ./deploy.sh
#   Or double-click: deploy/Deploy-Productie-Listara.desktop (copy to Desktop)
#
# First-time setup (Windows):
#   1. cp deploy/deploy.conf.example deploy/deploy.conf
#   2. Edit deploy/deploy.conf (host, user, path)
#   3. ./deploy.sh setup-ssh
#   4. Add public key to Windows; install OpenSSH Server + rsync on Windows
#   5. ssh-keyscan -p PORT HOST >> deploy/keys/known_hosts
#   6. ./deploy.sh test-ssh
#   7. ./deploy.sh
#

set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export ROOT
LIB="${ROOT}/deploy/lib"

# shellcheck source=deploy/lib/common.sh
source "${LIB}/common.sh"

usage() {
  sed -n '3,20p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
}

cmd_deploy() {
  local do_backup="true"
  [[ "${1:-}" == "--no-backup" ]] && do_backup="false"

  load_config
  log "=== Deploy started ==="

  "${LIB}/build.sh"
  write_version_manifest

  if [[ "${do_backup}" == "true" ]]; then
    "${LIB}/backup.sh" || {
      warn "Remote backup failed. Aborting deploy (use --no-backup to skip)."
      exit 1
    }
  fi

  "${LIB}/rsync-push.sh"
  "${LIB}/remote-tasks.sh" all

  log "=== Deploy finished successfully ==="
  log "Production: ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}"
}

cmd_dry_run() {
  export DRY_RUN=true
  load_config
  log "=== Dry run (no remote changes) ==="
  "${LIB}/build.sh"
  "${LIB}/rsync-push.sh"
}

main() {
  local command="${1:-deploy}"
  shift || true

  case "${command}" in
    deploy)
      cmd_deploy "$@"
      ;;
    dry-run)
      cmd_dry_run
      ;;
    build)
      load_config
      "${LIB}/build.sh"
      ;;
    backup)
      load_config
      "${LIB}/backup.sh"
      ;;
    sync|rsync)
      load_config
      "${LIB}/rsync-push.sh"
      ;;
    migrate)
      "${LIB}/remote-tasks.sh" migrate
      ;;
    db-sync)
      load_config
      warn "DB sync: merge tabele referință (nu șterge users/anunțuri): ${DB_SYNC_TABLES}"
      "${LIB}/remote-tasks.sh" db-sync
      ;;
    db-push)
      load_config
      if [[ "${DB_PUSH_MODE:-merge}" == "replace" ]]; then
        warn "ATENȚIE: înlocuiește ÎNTREAGA baza de date pe Listara (inclusiv users și listings)!"
      else
        warn "Push DB (merge): sincronizează setări/referință din local, PĂSTREAZĂ users și listings de pe Listara."
        warn "Tabele excluse: ${DB_PUSH_EXCLUDE_TABLES:-(implicit din db-push-excludes.sh)}"
      fi
      read -r -p "Continui? (yes/no): " confirm
      [[ "${confirm}" == "yes" ]] || die "Anulat."
      "${LIB}/db-full-push.sh"
      ;;
    db-replace)
      SQL_FILE="${2:-}"
      [[ -n "${SQL_FILE}" ]] || die "Usage: ./deploy.sh db-replace /path/to/listara.sql"
      DEPLOY_CONFIG="${DEPLOY_CONFIG:-deploy/deploy.conf.listara}" \
        bash "${ROOT}/deploy/linux/push-sql-full-replace.sh" "${SQL_FILE}"
      ;;
    verify)
      "${LIB}/remote-tasks.sh" verify
      ;;
    verify-listara)
      "${ROOT}/deploy/verify-listara.sh"
      ;;
    cache)
      load_config
      "${LIB}/remote-tasks.sh" cache
      ;;
    cdn-sync)
      load_config
      "${LIB}/remote-tasks.sh" cdn-sync
      ;;
    setup-autostart)
      ALLOW_WINDOWS_DEPLOY=1 load_config
      log "Syncing deploy/windows scripts to production..."
      "${LIB}/rsync-push.sh"
      chmod +x "${LIB}/setup-autostart.sh"
      "${LIB}/setup-autostart.sh"
      ;;
    setup-ssh)
      "${LIB}/ssh-setup.sh" setup
      ;;
    test-ssh)
      "${LIB}/ssh-setup.sh" test
      ;;
    help|-h|--help)
      usage
      ;;
    *)
      die "Unknown command: ${command}. Run: ./deploy.sh help"
      ;;
  esac
}

main "$@"
