#!/usr/bin/env bash
set -euo pipefail

ORIGEM="$(cd "$(dirname "$0")" && pwd)"
BASE="/opt/pele-ai"
VENV_NOVO="/opt/pele-ai/venv-hibrido"
VENV_ATUAL="/opt/pele-ai/venv"
ANALISADOR="$BASE/analisador_local.py"
MODELOS="$BASE/modelos"
MODELO="$MODELOS/face_landmarker.task"
PHP_DESTINO="/var/www/html/pele/analise_pele_paciente.php"

MODELO_URL="https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/latest/face_landmarker.task"

echo "=============================================="
echo "INSTALAÇÃO HÍBRIDA MEDIAPIPE TASKS + OPENCV"
echo "=============================================="

sudo apt-get update
sudo apt-get install -y \
    python3 \
    python3-venv \
    python3-pip \
    curl \
    ca-certificates \
    libglib2.0-0 \
    libgl1 \
    libgomp1

echo
echo "[1/8] Criando novo ambiente isolado..."

sudo rm -rf "$VENV_NOVO"
sudo mkdir -p "$BASE"
sudo chown -R "$(id -un)":"$(id -gn)" "$BASE"

python3 -m venv "$VENV_NOVO"

"$VENV_NOVO/bin/python" -m pip install \
    --upgrade \
    pip \
    setuptools \
    wheel

echo
echo "[2/8] Instalando versões compatíveis..."

if ! "$VENV_NOVO/bin/pip" install \
    -r "$ORIGEM/requirements.txt"
then
    echo
    echo "As versões fixadas não foram aceitas por esta versão do Python."
    echo "Instalando combinação compatível disponível..."

    "$VENV_NOVO/bin/pip" install \
        "numpy<2" \
        "opencv-python-headless<5" \
        mediapipe
fi

echo
echo "[3/8] Baixando modelo oficial do Face Landmarker..."

mkdir -p "$MODELOS"

curl \
    --fail \
    --location \
    --retry 3 \
    --connect-timeout 20 \
    "$MODELO_URL" \
    --output "$MODELO.tmp"

if [ ! -s "$MODELO.tmp" ]; then
    echo "ERRO: o modelo foi baixado vazio."
    exit 1
fi

mv "$MODELO.tmp" "$MODELO"
chmod 644 "$MODELO"

echo
echo "[4/8] Instalando analisador e endpoint..."

sudo cp "$ANALISADOR" \
    "${ANALISADOR}.bak_$(date +%Y%m%d_%H%M%S)" \
    2>/dev/null || true

sudo cp "$PHP_DESTINO" \
    "${PHP_DESTINO}.bak_$(date +%Y%m%d_%H%M%S)" \
    2>/dev/null || true

sudo cp "$ORIGEM/analisador_local.py" "$ANALISADOR"
sudo chown root:root "$ANALISADOR"
sudo chmod 755 "$ANALISADOR"

sudo cp "$ORIGEM/analise_pele_paciente.php" "$PHP_DESTINO"
sudo chown www-data:www-data "$PHP_DESTINO"
sudo chmod 664 "$PHP_DESTINO"

echo
echo "[5/8] Validando sintaxe e API MediaPipe Tasks..."

"$VENV_NOVO/bin/python" -m py_compile "$ANALISADOR"

PELE_FACE_LANDMARKER_MODEL="$MODELO" \
"$VENV_NOVO/bin/python" - <<'PY'
import cv2
import numpy
import mediapipe as mp
from pathlib import Path

model = Path("/opt/pele-ai/modelos/face_landmarker.task")

print("Python/venv: OK")
print("OpenCV:", cv2.__version__)
print("NumPy:", numpy.__version__)
print("MediaPipe:", getattr(mp, "__version__", "sem versão"))
print("Modelo existe:", model.is_file())
print("Modelo bytes:", model.stat().st_size)

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
Options = mp.tasks.vision.FaceLandmarkerOptions
RunningMode = mp.tasks.vision.RunningMode

options = Options(
    base_options=BaseOptions(
        model_asset_path=str(model)
    ),
    running_mode=RunningMode.IMAGE,
    num_faces=1
)

with FaceLandmarker.create_from_options(options):
    pass

print("MediaPipe Tasks Face Landmarker: OK")
PY

echo
echo "[6/8] Ativando o novo ambiente..."

if [ -e "$VENV_ATUAL" ] || [ -L "$VENV_ATUAL" ]; then
    sudo mv "$VENV_ATUAL" \
        "${VENV_ATUAL}.bak_$(date +%Y%m%d_%H%M%S)"
fi

sudo ln -s "$VENV_NOVO" "$VENV_ATUAL"

echo
echo "[7/8] Validando PHP..."

php -l "$PHP_DESTINO"

php -r '
echo function_exists("proc_open")
    ? "proc_open: OK\n"
    : "proc_open: DESABILITADO\n";
'

echo
echo "[8/8] Reiniciando Apache..."

sudo systemctl restart apache2

echo
echo "=============================================="
echo "INSTALAÇÃO CONCLUÍDA"
echo "=============================================="
echo "Python ativo: $VENV_ATUAL/bin/python"
echo "Analisador: $ANALISADOR"
echo "Modelo: $MODELO"
echo
echo "Execute agora:"
echo "$ORIGEM/testar_hibrido.sh /caminho/da/foto.jpg"
