#!/usr/bin/env bash
#
# deploy-staging.sh — commit del worktree + allineamento di dev + push su staging.
#
# Flusso:
#   1. `git add -A` + commit di tutto il worktree (se c'è qualcosa da committare).
#   2. Se il branch corrente non è `dev`: checkout di `dev` e merge del branch di partenza.
#   3. `git push staging dev` → il server di staging esegue il deploy automatico.
#
# A fine esecuzione il worktree resta su `dev`. Nulla viene mai pushato su `origin`
# (produzione): il push è esclusivamente verso il remote `staging`.
#
# Uso:
#   ./scripts/deploy-staging.sh ["messaggio di commit"]
#
# Se il messaggio è omesso viene usato "wip <YYYY-MM-DD HH:MM>".

set -euo pipefail

readonly TARGET_BRANCH='dev'
readonly TARGET_REMOTE='staging'

err() {
  printf '\033[31m[deploy-staging] ERRORE:\033[0m %s\n' "$1" >&2
}

info() {
  printf '\033[36m[deploy-staging]\033[0m %s\n' "$1"
}

# Radice del repo: lo script funziona da qualsiasi directory.
repo_root="$(git rev-parse --show-toplevel 2>/dev/null)" || {
  err 'Non sei dentro un repository git.'
  exit 1
}
cd "$repo_root"

# Un merge/rebase/cherry-pick interrotto va risolto a mano prima di procedere.
if [ -d "$(git rev-parse --git-path rebase-merge)" ] ||
  [ -d "$(git rev-parse --git-path rebase-apply)" ] ||
  [ -f "$(git rev-parse --git-path MERGE_HEAD)" ] ||
  [ -f "$(git rev-parse --git-path CHERRY_PICK_HEAD)" ]; then
  err 'Operazione git in corso (merge/rebase/cherry-pick): risolvila prima di rilanciare.'
  exit 1
fi

current_branch="$(git symbolic-ref --quiet --short HEAD)" || {
  err 'HEAD detached: fai il checkout di un branch prima di rilanciare.'
  exit 1
}

if ! git remote get-url "$TARGET_REMOTE" >/dev/null 2>&1; then
  err "Remote '$TARGET_REMOTE' non configurato."
  exit 1
fi

commit_message="${1:-wip $(date '+%Y-%m-%d %H:%M')}"

# --- 1. Stage + commit di tutto il worktree ------------------------------------

git add -A

if git diff --cached --quiet; then
  info 'Nessuna modifica da committare.'
else
  info "Commit su '$current_branch': $commit_message"
  git commit -q -m "$commit_message"
fi

# --- 2. Allineamento di dev ----------------------------------------------------

if [ "$current_branch" != "$TARGET_BRANCH" ]; then
  info "Checkout di '$TARGET_BRANCH'"
  git checkout -q "$TARGET_BRANCH"

  info "Merge di '$current_branch' su '$TARGET_BRANCH'"
  if ! git merge --no-edit "$current_branch"; then
    err "Conflitti nel merge di '$current_branch' su '$TARGET_BRANCH': risolvili e completa a mano (nessun push eseguito)."
    exit 1
  fi
fi

# --- 3. Push su staging → deploy automatico lato server ------------------------

info "Push su '$TARGET_REMOTE/$TARGET_BRANCH'"
git push "$TARGET_REMOTE" "$TARGET_BRANCH"

info "Fatto. Worktree su '$TARGET_BRANCH'; il deploy su staging parte automaticamente."
