#!/bin/bash
# Pipeline generico VM_NAME + VAPP_NAME por arg. Idempotente: skip ovftool se vmdks ja extraidos.
set -o pipefail
VM_NAME="${1:?VM_NAME required}"
VAPP="${2:?VAPP required}"
TS=$(date +%Y%m%d-%H%M%S)
LOG_BASE=/NFS01/migrate/logs/$VM_NAME-$TS

# Detect existing extraction
EXISTING_WORK_DIR=$(find /NFS01/migrate -maxdepth 1 -type d -name "migrate-$VM_NAME-*" 2>/dev/null | head -1)
EXISTING_VMDK=$(find /NFS01/migrate -maxdepth 4 -name "${VAPP}-disk1.vmdk" 2>/dev/null | head -1)
if [ -n "$EXISTING_VMDK" ] && [ -s "$EXISTING_VMDK" ]; then
  WORK_DIR=$(dirname "$(dirname "$EXISTING_VMDK")")
  echo "REUSING $WORK_DIR (vmdk found at $EXISTING_VMDK)" | tee -a "$LOG_BASE.log"
  SKIP_OVFTOOL=1
else
  WORK_DIR=/NFS01/migrate/migrate-$VM_NAME-$TS
  mkdir -p "$WORK_DIR"
  SKIP_OVFTOOL=0
fi
V2V_OUT=/NFS01/migrate/v2v-$VM_NAME-$TS
mkdir -p "$V2V_OUT" /NFS01/migrate/logs
LOG=$LOG_BASE.log

echo "=== $(date) START $VM_NAME ($VAPP) pipeline ===" | tee -a "$LOG"
echo "WORK_DIR=$WORK_DIR V2V_OUT=$V2V_OUT SKIP_OVFTOOL=$SKIP_OVFTOOL" | tee -a "$LOG"

if [ "$SKIP_OVFTOOL" = "0" ]; then
  echo "=== $(date) STAGE 1: ovftool extract vApp=$VAPP ===" | tee -a "$LOG"
  cd ~/ovftool || exit 1
  ./ovftool --schemaValidate=false --noSSLVerify \
    "vcloud://tarx:A0S6VeOPbLNP%21RKBtpx%2191y2%25IZlF4@vcd-tio.unifique.cloud:443?org=447986_TARX_ORG&vdc=447986_TARX_VDC-DC-SC-TIO-01&vapp=$VAPP" \
    "$WORK_DIR/" 2>&1 | tee -a "$LOG"
  OVFTOOL_RC=${PIPESTATUS[0]}
  echo "=== $(date) ovftool exit=$OVFTOOL_RC ===" | tee -a "$LOG"
  [ "$OVFTOOL_RC" -ne 0 ] && exit "$OVFTOOL_RC"
fi

DISK1=$(find "$WORK_DIR" -maxdepth 3 -name "*-disk1.vmdk" | head -1)
DISK2=$(find "$WORK_DIR" -maxdepth 3 -name "*-disk2.vmdk" | head -1)
DISK3=$(find "$WORK_DIR" -maxdepth 3 -name "*-disk3.vmdk" | head -1)
echo "DISK1='$DISK1'" | tee -a "$LOG"
echo "DISK2='$DISK2'" | tee -a "$LOG"
echo "DISK3='$DISK3'" | tee -a "$LOG"
[ -z "$DISK1" ] && { echo "ABORT: no disk1.vmdk found"; exit 5; }

echo "=== $(date) STAGE 2a: virt-v2v boot ===" | tee -a "$LOG.boot"
(
  echo "In0v@t3ch" | sudo -S env VIRTIO_WIN=/tmp/virtio-win.iso \
    virt-v2v -v -x -i disk "$DISK1" \
    -o local -of qcow2 -os "$V2V_OUT" \
    -on "$VM_NAME-boot" >> "$LOG.boot" 2>&1
  echo "=== $(date) virt-v2v exit=$? ===" >> "$LOG.boot"
) &
PID_BOOT=$!

PID_DATAS=()
for I in 2 3; do
  D_VAR="DISK$I"
  D="${!D_VAR}"
  [ -z "$D" ] && continue
  DLOG="$LOG.data$I"
  echo "=== $(date) STAGE 2b: qemu-img data$I ===" >> "$DLOG"
  (
    qemu-img convert -p -O qcow2 "$D" "$V2V_OUT/$VM_NAME-data$((I-1)).qcow2" >> "$DLOG" 2>&1
    echo "=== $(date) qemu-img data$I exit=$? ===" >> "$DLOG"
  ) &
  PID_DATAS+=($!)
done
echo "PID_BOOT=$PID_BOOT PID_DATAS=${PID_DATAS[*]}" | tee -a "$LOG"

wait $PID_BOOT
RC_BOOT=$?
for P in "${PID_DATAS[@]}"; do wait "$P"; done
echo "=== $(date) STAGE 2 DONE boot_rc=$RC_BOOT ===" | tee -a "$LOG"

# STAGE 2.5: Fix GPT→MBR + write bootloader in boot qcow2 (BIOS bootable for Wevy SeaBIOS)
# Detecta se eh Windows (NTFS) pra aplicar. Se Linux (XFS/ext4 puro) pula.
BOOT_QCOW2="$V2V_OUT/$VM_NAME-boot-sda"
if [ -f "$BOOT_QCOW2" ]; then
  IS_WINDOWS=$(echo "In0v@t3ch" | sudo -S virt-filesystems --long --all -a "$BOOT_QCOW2" 2>/dev/null | grep -c ntfs || true)
  echo "=== $(date) STAGE 2.5: IS_WINDOWS=$IS_WINDOWS ===" | tee -a "$LOG"
  if [ "$IS_WINDOWS" -gt 0 ]; then
    echo "In0v@t3ch" | sudo -S bash /NFS01/migrate/fix-boot-windows.sh "$BOOT_QCOW2" 2>&1 | tee -a "$LOG"
    FIX_RC=${PIPESTATUS[0]}
    echo "=== $(date) STAGE 2.5 fix exit=$FIX_RC ===" | tee -a "$LOG"
    [ "$FIX_RC" -ne 0 ] && { echo "ABORT STAGE 2.5"; exit 7; }
  else
    echo "skip — not Windows" | tee -a "$LOG"
  fi
fi
ls -lh "$V2V_OUT" | tee -a "$LOG"

[ "$RC_BOOT" -ne 0 ] && { echo "ABORT STAGE2 boot failed"; exit 6; }

echo "=== $(date) STAGE 3: move + upload ===" | tee -a "$LOG"
SERVE_DIR=/NFS01/migrate/$VM_NAME
mkdir -p "$SERVE_DIR"
echo "In0v@t3ch" | sudo -S bash -c "
  mv $V2V_OUT/$VM_NAME-boot-sda $SERVE_DIR/$VM_NAME-disk-0.qcow2 2>&1
  for I in 1 2; do
    SRC=$V2V_OUT/$VM_NAME-data\${I}.qcow2
    [ -f \$SRC ] && mv \$SRC $SERVE_DIR/$VM_NAME-disk-\${I}.qcow2
  done
  chmod 644 $SERVE_DIR/*.qcow2 2>/dev/null
  ls -lh $SERVE_DIR
" 2>&1 | tee -a "$LOG"

DISK_LIST=()
for f in "$SERVE_DIR"/*.qcow2; do
  [ -f "$f" ] && DISK_LIST+=("$(basename "$f" .qcow2)")
done
echo "DISKS: ${DISK_LIST[*]}" | tee -a "$LOG"

source <(echo "In0v@t3ch" | sudo -S cat /etc/wevy/sante-creds.env)
for VOL in "${DISK_LIST[@]}"; do
  URL="$TRANSFER_BASE/$VM_NAME/$VOL.qcow2"
  RC=$(curl -sI -o /dev/null -w "%{http_code}" "$URL")
  echo "smoke $URL -> $RC" | tee -a "$LOG"
  curl -s -X POST "$WEVY_API_URL/restapi/volume/uploadVolume" \
    -H "apikey: $WEVY_API_KEY" -H "secretkey: $WEVY_SECRET_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"name\":\"$VOL\",\"format\":\"QCOW2\",\"url\":\"$URL\",\"zoneUuid\":\"$WEVY_ZONE_UUID\"}" | tee -a "$LOG"
  echo | tee -a "$LOG"
done

echo "=== $(date) PIPELINE DONE for $VM_NAME ===" | tee -a "$LOG"
