#!/bin/zsh
# ==============================================================================
# GTA V Setup pour Mac M4 - Installation complète Wine + GPTK
# ==============================================================================
# Auteur: Configuration optimisée pour Mac ARM (M4 Pro)
# Performance: Metal + DXVK + D3DMetal + Esync/Fsync
# ==============================================================================

set -e  # Stop on error only (pas -u car variables Wine numériques)

# ==============================================================================
# COULEURS + LOGGING
# ==============================================================================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

log_info() { echo "${BLUE}[INFO]${NC} $1"; }
log_success() { echo "${GREEN}[OK]${NC} $1"; }
log_warning() { echo "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo "${RED}[ERROR]${NC} $1"; exit 1; }

# ==============================================================================
# VARIABLES D'ENVIRONNEMENT
# ==============================================================================
export WINEPREFIX="$HOME/wine-games"
export WINE_D3D_CONFIG="metal"
export WINEESYNC=1
export WINEFSYNC=1
export HOMEBREW_NO_AUTO_UPDATE=1

INSTALL_LOG="$HOME/gta5-setup.log"
> "$INSTALL_LOG"  # Clear log

log_info "Installation Wine/GPTK pour GTA V sur Mac M4 Pro"
log_info "Log: $INSTALL_LOG"
echo ""

# ==============================================================================
# ÉTAPE 1: VÉRIFICATIONS PRÉALABLES
# ==============================================================================
log_info "Étape 1/8: Vérifications préalables..."

# Vérifier Homebrew
if ! command -v brew &> /dev/null; then
    log_error "Homebrew non installé. Installe-le: /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\""
fi

# Vérifier Rosetta 2 (requis pour Wine sur ARM)
if ! pgrep oahd > /dev/null 2>&1; then
    log_warning "Rosetta 2 non installé. Installation..."
    softwareupdate --install-rosetta --agree-to-license 2>&1 | tee -a "$INSTALL_LOG"
fi

# Vérifier Xcode Command Line Tools
if ! xcode-select -p &> /dev/null; then
    log_warning "Xcode Command Line Tools non installés. Installation..."
    xcode-select --install
    log_info "Appuie sur Entrée après l'installation des Command Line Tools..."
    read
fi

log_success "Vérifications terminées"
echo ""

# ==============================================================================
# ÉTAPE 2: INSTALLER XQUARTZ + WINE + GPTK
# ==============================================================================
log_info "Étape 2/8: Installation XQuartz + Wine + Game Porting Toolkit..."

brew update 2>&1 | tee -a "$INSTALL_LOG"

# XQuartz (requis pour Wine GUI)
if ! brew list --cask xquartz &> /dev/null; then
    log_info "Installation XQuartz..."
    brew install --cask xquartz 2>&1 | tee -a "$INSTALL_LOG"
    log_warning "XQuartz installé. Tu devras te déconnecter/reconnecter pour l'activer complètement."
else
    log_success "XQuartz déjà installé"
fi

# Wine Stable (via Homebrew - version optimisée ARM)
if ! brew list --cask wine-stable &> /dev/null; then
    log_info "Installation Wine Stable..."
    brew install --cask wine-stable 2>&1 | tee -a "$INSTALL_LOG"
else
    log_success "Wine déjà installé"
fi

# Winetricks
if ! command -v winetricks &> /dev/null; then
    log_info "Installation Winetricks..."
    brew install winetricks 2>&1 | tee -a "$INSTALL_LOG"
else
    log_success "Winetricks déjà installé"
fi

# Game Porting Toolkit (Apple - CRITIQUE pour performances)
if ! brew list game-porting-toolkit &> /dev/null; then
    log_info "Installation Game Porting Toolkit (Apple)..."
    log_warning "Ceci peut prendre 10-20 minutes..."
    
    # Tap Apple Gaming repo
    brew tap apple/apple https://github.com/apple/homebrew-apple 2>&1 | tee -a "$INSTALL_LOG" || true
    
    # Install GPTK
    brew install game-porting-toolkit 2>&1 | tee -a "$INSTALL_LOG" || {
        log_warning "GPTK non disponible via Homebrew standard. Utilise Whisky à la place (Étape 6)."
    }
else
    log_success "Game Porting Toolkit déjà installé"
fi

# MoltenVK (DXVK Metal backend)
if ! brew list molten-vk &> /dev/null; then
    log_info "Installation MoltenVK..."
    brew install molten-vk 2>&1 | tee -a "$INSTALL_LOG" || log_warning "MoltenVK installation échouée (non critique)"
else
    log_success "MoltenVK déjà installé"
fi

# GStreamer (codecs audio/video pour jeux)
if ! brew list gstreamer &> /dev/null; then
    log_info "Installation GStreamer + plugins..."
    brew install gstreamer gst-plugins-base gst-plugins-good gst-libav 2>&1 | tee -a "$INSTALL_LOG"
else
    log_success "GStreamer déjà installé"
fi

log_success "Étape 2 terminée"
echo ""

# ==============================================================================
# ÉTAPE 3: CRÉER WINE PREFIX OPTIMISÉ 64-BIT
# ==============================================================================
log_info "Étape 3/8: Création Wine prefix optimisé..."

if [ -d "$WINEPREFIX" ]; then
    log_warning "Wine prefix existe déjà ($WINEPREFIX)"
    log_info "Veux-tu le réinitialiser? (o/N)"
    read -r REPLY
    if [[ $REPLY =~ ^[Oo]$ ]]; then
        log_info "Suppression ancien prefix..."
        rm -rf "$WINEPREFIX"
    fi
fi

if [ ! -d "$WINEPREFIX" ]; then
    log_info "Création prefix 64-bit..."
    WINEARCH=win64 wineboot -i 2>&1 | tee -a "$INSTALL_LOG"
    log_success "Prefix créé: $WINEPREFIX"
else
    log_success "Prefix déjà configuré"
fi

echo ""

# ==============================================================================
# ÉTAPE 4: INSTALLER DXVK + D3D + DLL ESSENTIELLES
# ==============================================================================
log_info "Étape 4/8: Installation DXVK + DirectX + DLL Windows..."

# DXVK (DirectX 9/10/11 → Vulkan → Metal)
log_info "Installation DXVK..."
winetricks -q dxvk 2>&1 | tee -a "$INSTALL_LOG" || log_warning "DXVK installation échouée (non bloquant)"

# DirectX 9/10/11
log_info "Installation DirectX..."
winetricks -q d3dx9 d3dx10 d3dx11_43 2>&1 | tee -a "$INSTALL_LOG" || log_warning "DirectX installation partielle"

# Visual C++ Runtimes (requis par GTA V)
log_info "Installation Visual C++ Runtimes..."
winetricks -q vcrun2015 vcrun2017 vcrun2019 vcrun2022 2>&1 | tee -a "$INSTALL_LOG" || log_warning "VCRun installation partielle"

# .NET Framework 4.8 (Rockstar Launcher)
log_info "Installation .NET Framework 4.8..."
winetricks -q dotnet48 2>&1 | tee -a "$INSTALL_LOG" || log_warning ".NET installation échouée"

# Fonts (évite textes manquants)
log_info "Installation fonts..."
winetricks -q corefonts fontsmooth=rgb 2>&1 | tee -a "$INSTALL_LOG"

log_success "Étape 4 terminée"
echo ""

# ==============================================================================
# ÉTAPE 5: OPTIMISER PERFORMANCES GPU/CPU
# ==============================================================================
log_info "Étape 5/8: Optimisation performances (Metal + Esync/Fsync)..."

# Activer GLSL + Metal renderer
log_info "Configuration renderer Metal..."
winetricks settings glsl=enabled 2>&1 | tee -a "$INSTALL_LOG" || true
winetricks settings renderer=vulkan 2>&1 | tee -a "$INSTALL_LOG" || true
winetricks settings multithreaded=on 2>&1 | tee -a "$INSTALL_LOG" || true

# Fullscreen virtuel (meilleure compatibilité)
winetricks settings fullscreen=virtual 2>&1 | tee -a "$INSTALL_LOG" || true

# Désactiver dxvk_nvapi (pas de NVIDIA sur Mac)
winetricks settings dxvk_nvapi=disabled 2>&1 | tee -a "$INSTALL_LOG" || true

# Large Address Aware (GTA V = 4GB+ RAM)
winetricks settings large_address_aware=enabled 2>&1 | tee -a "$INSTALL_LOG" || true

log_success "Optimisations appliquées"
echo ""

# ==============================================================================
# ÉTAPE 6: CONFIGURER VARIABLES D'ENVIRONNEMENT PERMANENTES
# ==============================================================================
log_info "Étape 6/8: Configuration variables d'environnement..."

ZPROFILE="$HOME/.zprofile"

# Backup .zprofile
if [ -f "$ZPROFILE" ]; then
    cp "$ZPROFILE" "$ZPROFILE.backup.$(date +%s)"
fi

# Ajouter variables si absentes
grep -q "WINEPREFIX" "$ZPROFILE" 2>/dev/null || {
    log_info "Ajout variables Wine dans $ZPROFILE..."
    cat >> "$ZPROFILE" << 'EOF'

# ==============================================================================
# Wine + Game Porting Toolkit - GTA V
# ==============================================================================
export WINEPREFIX="$HOME/wine-games"
export WINE_D3D_CONFIG="metal"
export WINEESYNC=1
export WINEFSYNC=1
export DXVK_HUD=0  # Désactiver overlay DXVK (performance)
export DXVK_LOG_LEVEL=none  # Réduire logs

# Optimisations Metal
export MTL_HUD_ENABLED=0
export MTL_SHADER_VALIDATION=0

# Performance CPU
export WINEDEBUG=-all  # Désactiver debug logs (gain FPS)
EOF
    log_success "Variables ajoutées à $ZPROFILE"
}

# Recharger variables
source "$ZPROFILE"

log_success "Configuration environnement terminée"
echo ""

# ==============================================================================
# ÉTAPE 7: INSTALLER WHISKY (INTERFACE OPTIMISÉE)
# ==============================================================================
log_info "Étape 7/8: Installation Whisky (recommandé pour GTA V)..."

if ! brew list --cask whisky &> /dev/null; then
    log_info "Installation Whisky..."
    brew install --cask whisky 2>&1 | tee -a "$INSTALL_LOG"
    log_success "Whisky installé"
    log_info "Lance Whisky via Launchpad ou /Applications/Whisky.app"
    log_info "Dans Whisky: Create Bottle → Importe ton prefix Wine depuis $WINEPREFIX"
else
    log_success "Whisky déjà installé"
fi

echo ""

# ==============================================================================
# ÉTAPE 8: CRÉER SCRIPT DE LANCEMENT GTA V
# ==============================================================================
log_info "Étape 8/8: Création script de lancement GTA V..."

LAUNCH_SCRIPT="$HOME/launch-gta5.sh"

cat > "$LAUNCH_SCRIPT" << 'EOF'
#!/bin/zsh
# ==============================================================================
# Lancement GTA V optimisé pour Mac M4
# ==============================================================================

export WINEPREFIX="$HOME/wine-games"
export WINE_D3D_CONFIG="metal"
export WINEESYNC=1
export WINEFSYNC=1
export WINEDEBUG=-all
export DXVK_HUD=0

# Chemin GTA V (à adapter selon ton installation)
GTA5_PATH="/Volumes/Systeme/Program Files/Rockstar Games/Grand Theft Auto V"
GTA5_EXE="GTA5.exe"

echo "Lancement GTA V..."
cd "$GTA5_PATH" || { echo "Erreur: GTA V non trouvé"; exit 1; }

wine "$GTA5_EXE" "$@"
EOF

chmod +x "$LAUNCH_SCRIPT"
log_success "Script créé: $LAUNCH_SCRIPT"

echo ""

# ==============================================================================
# RÉSUMÉ FINAL
# ==============================================================================
echo ""
echo "${GREEN}=============================================================================="
echo "✅ INSTALLATION TERMINÉE"
echo "==============================================================================${NC}"
echo ""
echo "${BLUE}📦 Composants installés:${NC}"
echo "  - Wine Stable (ARM optimisé)"
echo "  - XQuartz (GUI)"
echo "  - Winetricks"
echo "  - Game Porting Toolkit (Metal DirectX)"
echo "  - DXVK + MoltenVK"
echo "  - DirectX 9/10/11"
echo "  - Visual C++ Runtimes (2015-2022)"
echo "  - .NET Framework 4.8"
echo "  - Whisky (interface)"
echo ""
echo "${BLUE}⚙️  Optimisations activées:${NC}"
echo "  - Metal renderer (DirectX → Metal)"
echo "  - Esync/Fsync (FPS boost)"
echo "  - DXVK (Vulkan backend)"
echo "  - Large Address Aware (4GB+ RAM)"
echo "  - Multithreading"
echo ""
echo "${BLUE}📂 Wine Prefix:${NC} $WINEPREFIX"
echo "${BLUE}📜 Log complet:${NC} $INSTALL_LOG"
echo ""
echo "${YELLOW}🎮 PROCHAINES ÉTAPES:${NC}"
echo ""
echo "1️⃣  Redémarre ta session (pour activer XQuartz)"
echo ""
echo "2️⃣  Configure ton disque Windows dans Wine:"
echo "    winecfg"
echo "    → Onglet 'Drives' → Add → D: → /Volumes/Systeme"
echo ""
echo "3️⃣  Installe Steam (si GTA V via Steam):"
echo "    winetricks steam"
echo ""
echo "4️⃣  OU utilise Whisky (recommandé):"
echo "    - Ouvre Whisky (/Applications/Whisky.app)"
echo "    - Create Bottle → Importe $WINEPREFIX"
echo "    - Ajoute GTA5.exe comme programme"
echo ""
echo "5️⃣  Lance GTA V:"
echo "    $LAUNCH_SCRIPT"
echo "    (Édite le chemin GTA V dans le script si besoin)"
echo ""
echo "${GREEN}🚀 Bon jeu!${NC}"
echo ""
