#!/usr/bin/env bash
set -euo pipefail
# Usage: ./scripts/bump-version.sh <semver|patch|minor|major>

# ---------------------------------------------------------------------------
# T-02: Validação de argumento
# ---------------------------------------------------------------------------
if [ $# -ne 1 ]; then
  echo "Uso: $0 <patch|minor|major|X.Y.Z>" >&2
  exit 2
fi

ARG="$1"

# Aceitar: patch, minor, major, ou semver X.Y.Z (apenas dígitos e pontos)
case "$ARG" in
  patch|minor|major) ;;
  [0-9]*.[0-9]*.[0-9]*)
    # Validação estrita: deve ser exatamente N.N.N (sem sufixos)
    if ! echo "$ARG" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
      echo "Erro: argumento inválido '$ARG'. Use patch, minor, major ou X.Y.Z." >&2
      exit 2
    fi
    ;;
  *)
    echo "Erro: argumento inválido '$ARG'. Use patch, minor, major ou X.Y.Z." >&2
    exit 2
    ;;
esac

# ---------------------------------------------------------------------------
# T-03: Resolução de versão alvo
# ---------------------------------------------------------------------------
CURRENT=$(cat VERSION | tr -d '[:space:]')

# Validar que CURRENT é semver
if ! echo "$CURRENT" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
  echo "Erro: VERSION contém valor inválido ('$CURRENT'). Esperado X.Y.Z." >&2
  exit 1
fi

IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT"

case "$ARG" in
  patch)
    PATCH=$(( PATCH + 1 ))
    TARGET="${MAJOR}.${MINOR}.${PATCH}"
    ;;
  minor)
    MINOR=$(( MINOR + 1 ))
    PATCH=0
    TARGET="${MAJOR}.${MINOR}.${PATCH}"
    ;;
  major)
    MAJOR=$(( MAJOR + 1 ))
    MINOR=0
    PATCH=0
    TARGET="${MAJOR}.${MINOR}.${PATCH}"
    ;;
  *)
    TARGET="$ARG"
    ;;
esac

# ---------------------------------------------------------------------------
# T-04: Backup + edição cirúrgica de Cargo.toml via awk
# ---------------------------------------------------------------------------
cp Cargo.toml Cargo.toml.bak && cp Cargo.lock Cargo.lock.bak

awk -v v="$TARGET" '
  /^\[/ { inpkg = ($0 == "[package]") }
  inpkg && /^[[:space:]]*version[[:space:]]*=/ && !done {
    print "version = \"" v "\""
    done=1
    next
  }
  { print }
' Cargo.toml > Cargo.toml.tmp && mv Cargo.toml.tmp Cargo.toml

# ---------------------------------------------------------------------------
# T-05: cargo update + escrita de VERSION + rollback em falha
# ---------------------------------------------------------------------------
if ! cargo update -p sdd-layer --precise "$TARGET"; then
  cp Cargo.toml.bak Cargo.toml && cp Cargo.lock.bak Cargo.lock
  rm -f Cargo.toml.bak Cargo.lock.bak
  echo "Erro: 'cargo update -p sdd-layer --precise $TARGET' falhou. Rollback executado." >&2
  exit 1
fi

printf '%s\n' "$TARGET" > VERSION

rm -f Cargo.toml.bak Cargo.lock.bak

# ---------------------------------------------------------------------------
# T-06: Saída resumo + exit 0
# ---------------------------------------------------------------------------
echo "bump-version: $CURRENT -> $TARGET"
echo "  VERSION      $TARGET"
echo "  Cargo.toml   $TARGET"
echo "  Cargo.lock   $TARGET  (sdd-layer)"
echo "OK"

exit 0
