#!/usr/bin/env bash
# =============================================================================
#  build-and-push-fix.sh
#
#  Build LOCAL de l'image OSEP avec --no-cache (busting du cache BuildKit
#  potentiellement pourri sur GitHub Actions), push sur Docker Hub, puis
#  optionnel : déclenchement du redéploiement Swarm sur le serveur via SSH.
#
#  Usage :
#     ./build-and-push-fix.sh                # build + push
#     ./build-and-push-fix.sh --deploy       # build + push + deploy SSH
#     ./build-and-push-fix.sh --deploy -y    # idem, sans confirmation
#     ./build-and-push-fix.sh --tag v1.0.1   # avec un tag custom
#
#  Pré-requis :
#   - docker buildx installé (Docker Desktop ou docker-buildx-plugin)
#   - être logué sur Docker Hub : `docker login -u massambafall92`
#   - (--deploy) accès SSH configuré au serveur
# =============================================================================

set -euo pipefail

# -------- Config --------------------------------------------------------------
IMAGE_NAME="massambafall92/kplan-www"
DOCKERFILE="docker/stack/php/Dockerfile"
PLATFORM="linux/amd64"

# Serveur de prod (override possible via vars d'env)
SSH_HOST="${SSH_HOST:-srv-mctn-kplan-app}"
SSH_USER="${SSH_USER:-adminadie}"
SSH_PORT="${SSH_PORT:-22}"
REMOTE_DEPLOY_DIR="${REMOTE_DEPLOY_DIR:-/opt/kplan}"

# -------- Couleurs ------------------------------------------------------------
if [ -t 1 ] && [ -z "${NO_COLOR:-}" ]; then
    C_BLUE='\033[1;34m'; C_GREEN='\033[1;32m'; C_YELLOW='\033[1;33m'
    C_RED='\033[1;31m';  C_DIM='\033[2m';      C_RESET='\033[0m'
else
    C_BLUE=''; C_GREEN=''; C_YELLOW=''; C_RED=''; C_DIM=''; C_RESET=''
fi
log()  { printf "${C_BLUE}▸ %s${C_RESET}\n" "$*"; }
ok()   { printf "${C_GREEN}✓ %s${C_RESET}\n" "$*"; }
warn() { printf "${C_YELLOW}⚠ %s${C_RESET}\n" "$*"; }
err()  { printf "${C_RED}✗ %s${C_RESET}\n" "$*" >&2; }

# -------- Parsing args --------------------------------------------------------
DO_DEPLOY=false
SKIP_CONFIRM=false
TAG_OVERRIDE=""

while [ "$#" -gt 0 ]; do
    case "$1" in
        --deploy)   DO_DEPLOY=true ;;
        -y|--yes)   SKIP_CONFIRM=true ;;
        --tag)      shift; TAG_OVERRIDE="$1" ;;
        -h|--help)
            sed -n '2,20p' "$0" | sed 's/^# *//;s/^#//'
            exit 0
            ;;
        *) err "Argument inconnu : $1"; exit 1 ;;
    esac
    shift
done

# -------- Pré-flight ----------------------------------------------------------
if [ ! -f "$DOCKERFILE" ]; then
    err "Dockerfile introuvable : $DOCKERFILE"
    err "Lance ce script depuis la racine du repo (où se trouve docker/)"
    exit 1
fi

if ! command -v docker >/dev/null 2>&1; then
    err "docker CLI non installé"
    exit 1
fi

if ! docker buildx version >/dev/null 2>&1; then
    err "docker buildx non disponible — installe Docker Desktop ou docker-buildx-plugin"
    exit 1
fi

# Détecter l'utilisateur loggué Docker Hub
if ! docker info 2>/dev/null | grep -qE "Username:\s*(massambafall92|.+)"; then
    warn "Pas de session Docker Hub active — login requis"
    log "→ docker login -u massambafall92"
    docker login || { err "Login Docker Hub échoué"; exit 1; }
fi

# -------- Génération du tag ---------------------------------------------------
if [ -n "$TAG_OVERRIDE" ]; then
    TAG="$TAG_OVERRIDE"
else
    SHA="$(git rev-parse --short=7 HEAD 2>/dev/null || echo nogit)"
    TAG="$(date +%Y%m%d%H%M)-${SHA}"
fi
FULL_IMAGE="${IMAGE_NAME}:${TAG}"

log "Image qui sera produite :"
echo "    ${FULL_IMAGE}"
echo "    ${IMAGE_NAME}:latest"

# -------- Confirmation --------------------------------------------------------
if [ "$SKIP_CONFIRM" = false ]; then
    printf "${C_YELLOW}? Builder et pousser cette image ? [y/N] ${C_RESET}"
    read -r REPLY
    case "$REPLY" in
        y|Y|yes) ;;
        *) err "Annulé par l'utilisateur"; exit 1 ;;
    esac
fi

# -------- Build & push --------------------------------------------------------
log "Build sans cache (peut prendre 5-10 min)..."
docker buildx build \
    --no-cache \
    --platform "$PLATFORM" \
    -f "$DOCKERFILE" \
    -t "$FULL_IMAGE" \
    -t "${IMAGE_NAME}:latest" \
    --push \
    .

ok "Image poussée : $FULL_IMAGE"
ok "Image poussée : ${IMAGE_NAME}:latest"

# -------- Validation locale post-build ---------------------------------------
log "Vérification du bundle CSS dans l'image fraîche..."
docker pull "$FULL_IMAGE" >/dev/null 2>&1 || true

VALIDATION_OUTPUT=$(docker run --rm --entrypoint sh "$FULL_IMAGE" -c '
    APP_CSS=$(find /var/www/public/build -name "app.*.css" 2>/dev/null | head -1)
    if [ -z "$APP_CSS" ]; then
        APP_CSS=$(find /var/www/public/build -name "app.css" | head -1)
    fi
    if [ -z "$APP_CSS" ]; then
        echo "MISSING"
        exit 1
    fi
    COUNT=$(grep -c "osep-" "$APP_CSS" 2>/dev/null || echo 0)
    SIZE=$(stat -c "%s" "$APP_CSS")
    echo "FILE=$APP_CSS"
    echo "SIZE=$SIZE"
    echo "OSEP_COUNT=$COUNT"
' 2>&1) || true

echo "$VALIDATION_OUTPUT" | sed 's/^/    /'

OSEP_COUNT=$(echo "$VALIDATION_OUTPUT" | grep "OSEP_COUNT=" | cut -d= -f2 | tr -d ' \r')
if [ -z "$OSEP_COUNT" ] || [ "$OSEP_COUNT" -lt 1000 ]; then
    err "Validation échouée : le bundle ne contient pas assez de classes osep- ($OSEP_COUNT)"
    err "Le SCSS OSEP n'est pas correctement compilé. Vérifier :"
    err "  - assets/styles/osep.scss (188K, 6697 lignes)"
    err "  - assets/styles/app.scss line 732 : @import \"./osep.scss\";"
    err "  - les warnings du build (npm run build localement)"
    exit 1
fi
ok "Validation passée : ${OSEP_COUNT} classes osep- dans le bundle"

# -------- Déploiement SSH (optionnel) ----------------------------------------
if [ "$DO_DEPLOY" = false ]; then
    cat <<EOF

${C_DIM}── Étapes suivantes ────────────────────────────────────────────────${C_RESET}
  1. Sur le serveur (${SSH_USER}@${SSH_HOST}) :
     ${C_DIM}cd ${REMOTE_DEPLOY_DIR}${C_RESET}
     ${C_DIM}docker pull ${FULL_IMAGE}${C_RESET}
     ${C_DIM}export KPLAN_IMAGE_PHP=${FULL_IMAGE}${C_RESET}
     ${C_DIM}./deploy.sh${C_RESET}

  2. Ou tout en un, relance ce script avec --deploy :
     ${C_DIM}./build-and-push-fix.sh --deploy --tag ${TAG}${C_RESET}

EOF
    exit 0
fi

log "Déploiement SSH sur ${SSH_USER}@${SSH_HOST}:${SSH_PORT}..."

# Vérifier la connexion SSH
if ! ssh -p "$SSH_PORT" -o ConnectTimeout=10 -o BatchMode=yes \
       "${SSH_USER}@${SSH_HOST}" "echo OK" >/dev/null 2>&1; then
    err "Connexion SSH impossible vers ${SSH_USER}@${SSH_HOST}:${SSH_PORT}"
    err "Vérifie ta clé SSH ou les variables SSH_HOST / SSH_USER / SSH_PORT"
    exit 1
fi

# Pull + deploy distant
ssh -p "$SSH_PORT" "${SSH_USER}@${SSH_HOST}" bash -s <<REMOTE_SCRIPT
set -euo pipefail
echo "▸ Pull de l'image $FULL_IMAGE sur le serveur..."
docker pull "$FULL_IMAGE"
docker pull "${IMAGE_NAME}:latest"

echo "▸ cd ${REMOTE_DEPLOY_DIR}"
cd "${REMOTE_DEPLOY_DIR}"

echo "▸ Export KPLAN_IMAGE_PHP=$FULL_IMAGE"
export KPLAN_IMAGE_PHP="$FULL_IMAGE"

echo "▸ Lancement de deploy.sh"
./deploy.sh
REMOTE_SCRIPT

ok "Déploiement terminé"

cat <<EOF

${C_DIM}── Vérifications post-déploiement ──────────────────────────────────${C_RESET}
  Test CSS :        ${C_DIM}curl -I https://votre-domaine/build/manifest.json${C_RESET}
  Hard reload UI :  ${C_DIM}Ctrl+Shift+R dans le navigateur${C_RESET}

EOF
