#!/bin/zsh
# ============================================================
#  CODEX CLIENT BOOTSTRAP - macOS / MacBook
#  Usage:
#    1) Double-cliquer si ce fichier est executable
#    2) Ou lancer dans Terminal:
#       chmod +x install_codex_client_mac.command
#       ./install_codex_client_mac.command
# ============================================================

set -u

BOOTSTRAP_ROOT="$HOME/Codex-Workspace"
LOG_DIR="$BOOTSTRAP_ROOT/_installation_logs"
REPORT_PATH="$BOOTSTRAP_ROOT/rapport-installation-mac.txt"
START_HERE_PATH="$BOOTSTRAP_ROOT/START_HERE_MAC.txt"
AGENT_PATH="$BOOTSTRAP_ROOT/AGENTS.md"
CODEX_DIR="$HOME/.codex"
CODEX_CONFIG="$CODEX_DIR/config.toml"
DESKTOP_DIR="$HOME/Desktop"
DESKTOP_LAUNCHER="$DESKTOP_DIR/Demarrer Codex.command"

mkdir -p "$BOOTSTRAP_ROOT" "$LOG_DIR" "$CODEX_DIR"

{
  echo "Rapport installation Codex client macOS"
  echo "Utilisateur: $(whoami)"
  echo "Machine: $(hostname)"
  echo "Date: $(date)"
  echo "macOS: $(sw_vers -productVersion 2>/dev/null || echo inconnu)"
  echo "Architecture: $(uname -m)"
  echo ""
} > "$REPORT_PATH"

log_report() {
  echo "$(date '+%Y-%m-%d %H:%M:%S')  $1" >> "$REPORT_PATH"
}

step() {
  echo ""
  echo "=== $1 ==="
}

ok() {
  echo "[OK] $1"
  log_report "OK - $1"
}

warn() {
  echo "[ATTENTION] $1"
  log_report "WARN - $1"
}

fail() {
  echo "[ERREUR] $1"
  log_report "ERROR - $1"
}

command_exists() {
  command -v "$1" >/dev/null 2>&1
}

detect_brew_prefix() {
  if [[ "$(uname -m)" == "arm64" ]]; then
    echo "/opt/homebrew"
  else
    echo "/usr/local"
  fi
}

load_brew_env() {
  local prefix
  prefix="$(detect_brew_prefix)"

  if [[ -x "$prefix/bin/brew" ]]; then
    eval "$("$prefix/bin/brew" shellenv)"
  elif command_exists brew; then
    eval "$(brew shellenv)"
  fi
}

ensure_shell_profile_path() {
  local prefix="$1"
  local profile="$HOME/.zprofile"
  local line='eval "$('"$prefix"'/bin/brew shellenv)"'

  touch "$profile"

  if ! grep -Fq "$prefix/bin/brew shellenv" "$profile" 2>/dev/null; then
    {
      echo ""
      echo "# Homebrew"
      echo "$line"
    } >> "$profile"
    ok "PATH Homebrew ajoute dans ~/.zprofile"
  else
    ok "PATH Homebrew deja present dans ~/.zprofile"
  fi
}

echo ""
echo "===================================================="
echo " INSTALLATION ENVIRONNEMENT CODEX CLIENT - macOS"
echo "===================================================="
echo "Dossier de travail: $BOOTSTRAP_ROOT"

step "Verification macOS"

if [[ "$(uname)" != "Darwin" ]]; then
  fail "Ce fichier est uniquement pour macOS."
  echo "Utilise le fichier Windows .cmd sur PC Windows."
  exit 1
fi

ok "macOS detecte."

step "Installation / verification Homebrew"

load_brew_env

if ! command_exists brew; then
  warn "Homebrew n'est pas installe. Installation en cours."
  echo "macOS peut demander le mot de passe administrateur."
  echo "Le mot de passe ne s'affiche pas pendant la saisie: c'est normal."

  # Installation officielle Homebrew en mode non interactif lorsque possible.
  NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  BREW_PREFIX="$(detect_brew_prefix)"
  ensure_shell_profile_path "$BREW_PREFIX"
  load_brew_env
fi

if command_exists brew; then
  ok "Homebrew disponible: $(brew --version | head -n 1)"
else
  fail "Homebrew indisponible. Consulte le rapport: $REPORT_PATH"
  exit 1
fi

step "Installation des outils de base"

install_brew_formula() {
  local formula="$1"
  local label="$2"

  if brew list "$formula" >/dev/null 2>&1; then
    ok "$label deja installe."
  else
    echo "Installation: $label"
    if brew install "$formula"; then
      ok "$label installe."
    else
      warn "$label non installe automatiquement."
    fi
  fi
}

install_brew_cask() {
  local cask="$1"
  local label="$2"

  if brew list --cask "$cask" >/dev/null 2>&1; then
    ok "$label deja installe."
  else
    echo "Installation: $label"
    if brew install --cask "$cask"; then
      ok "$label installe."
    else
      warn "$label non installe automatiquement."
    fi
  fi
}

brew update || warn "brew update n'a pas reussi, on continue avec l'etat actuel."

install_brew_formula "git" "Git"
install_brew_formula "node" "Node.js + npm"
install_brew_formula "python@3.12" "Python 3.12"
install_brew_formula "gh" "GitHub CLI"
install_brew_cask "visual-studio-code" "Visual Studio Code"

# Docker volontairement non installe par defaut: lourd et demande souvent des validations.
log_report "INFO - Docker Desktop non installe par defaut."

step "Configuration Git minimale"

if command_exists git; then
  git config --global init.defaultBranch main || true
  git config --global pull.rebase false || true
  git config --global core.autocrlf input || true
  ok "Git configure."
else
  warn "Git non detecte dans cette session."
fi

step "Installation Codex CLI"

CODEX_INSTALLED=false

if command_exists codex; then
  ok "Codex CLI deja installe: $(codex --version 2>/dev/null | head -n 1 || echo detecte)"
  CODEX_INSTALLED=true
else
  echo "Installation via l'installateur officiel macOS/Linux..."
  if curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh; then
    # Recharger les chemins habituels ou l'installation autonome peut avoir depose codex.
    export PATH="$HOME/.local/bin:$HOME/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
    if command_exists codex; then
      ok "Codex CLI installe via installateur officiel."
      CODEX_INSTALLED=true
    else
      warn "Installateur termine, mais codex n'est pas encore dans le PATH."
    fi
  else
    warn "Installateur officiel Codex non termine."
  fi
fi

if [[ "$CODEX_INSTALLED" != "true" ]]; then
  if command_exists npm; then
    echo "Fallback via npm: npm install -g @openai/codex@latest"
    if npm install -g "@openai/codex@latest"; then
      if command_exists codex; then
        ok "Codex CLI installe via npm."
        CODEX_INSTALLED=true
      else
        warn "Codex installe via npm mais pas encore detecte dans le PATH."
      fi
    else
      warn "Fallback npm non termine."
    fi
  else
    warn "npm indisponible, impossible de tenter le fallback npm."
  fi
fi

step "Configuration Codex securisee"

cat > "$CODEX_CONFIG" <<'TOML'
# Configuration generee par install_codex_client_mac.command
# Objectif: permettre a Codex de travailler dans le dossier du projet sans acces illimite.

# Codex demande confirmation lorsqu'il veut sortir du cadre autorise.
approval_policy = "on-request"

# Codex peut lire/modifier le workspace courant, mais pas toute la machine.
sandbox_mode = "workspace-write"

# En workspace-write, garder le reseau coupe par defaut sauf besoin explicite.
[sandbox_workspace_write]
network_access = false
TOML

ok "Config Codex creee: $CODEX_CONFIG"

step "Creation du fichier AGENTS.md"

cat > "$AGENT_PATH" <<'MARKDOWN'
# AGENTS.md

## Mission de l'agent

Tu aides l'utilisateur a comprendre, corriger, ameliorer et automatiser ses projets logiciels.
Tu dois etre prudent, pedagogique et orienté resultat.

## Regles de securite

- Ne jamais supprimer massivement des fichiers sans expliquer clairement le risque.
- Ne jamais modifier un environnement de production sans confirmation humaine.
- Ne jamais commit, push, deployer ou publier sans accord explicite.
- Ne jamais mettre de secrets, mots de passe, tokens ou cles API dans le code.
- Toujours preferer des changements petits, testables et reversibles.
- Toujours expliquer ce que tu vas changer avant un gros changement.

## Methode de travail

1. Comprendre le projet et lire les fichiers importants.
2. Proposer un plan court.
3. Modifier seulement ce qui est necessaire.
4. Lancer les tests ou checks disponibles.
5. Donner un resume clair:
   - fichiers modifies
   - probleme corrige
   - tests lances
   - prochaines actions recommandees

## Commandes usuelles a essayer selon le projet

### Python
- python3 --version
- python3 -m pip install -r requirements.txt
- python3 -m pytest
- black .
- isort .

### Node.js / React
- node --version
- npm install
- npm run lint
- npm run test
- npm run build

### Git
- git status
- git diff
- git log --oneline -5

## Style de reponse

- Repondre simplement.
- Eviter le jargon inutile.
- Donner des etapes actionnables.
- Signaler clairement les incertitudes.
MARKDOWN

ok "AGENTS.md cree: $AGENT_PATH"

step "Creation du guide client"

cat > "$START_HERE_PATH" <<EOF
DEMARRAGE RAPIDE - CODEX CLIENT MAC

1. Ouvre le raccourci sur le Bureau:
   "Demarrer Codex.command"

2. Lors du premier lancement, Codex demandera une connexion.
   Connecte-toi avec ton compte ChatGPT ou une cle API OpenAI.

3. Mets ton projet dans ce dossier:
   $BOOTSTRAP_ROOT

4. Exemple de premiere demande a taper dans Codex:

   Analyse ce projet. Explique-moi ce qu'il fait, comment le lancer,
   quels fichiers sont importants, et propose un plan d'amelioration sans rien modifier.

5. Exemple pour corriger un probleme:

   Cherche pourquoi le projet ne se lance pas. Propose un plan,
   puis fais uniquement les changements necessaires. Lance les tests si disponibles.

6. Regle importante:
   Ne donne jamais a Codex tes mots de passe, tes cles API ou tes acces bancaires.
   Pour les projets sensibles, demande toujours validation avant modification.

Fichiers importants:
- Configuration Codex: $CODEX_CONFIG
- Instructions agent: $AGENT_PATH
- Rapport installation: $REPORT_PATH
EOF

ok "Guide client cree: $START_HERE_PATH"

step "Creation du raccourci Bureau"

cat > "$DESKTOP_LAUNCHER" <<EOF
#!/bin/zsh
cd "$BOOTSTRAP_ROOT"
echo "Dossier Codex: $BOOTSTRAP_ROOT"
echo "Si Codex ne demarre pas automatiquement, tape: codex"
echo ""
export PATH="\$HOME/.local/bin:\$HOME/bin:/opt/homebrew/bin:/usr/local/bin:\$PATH"
if command -v codex >/dev/null 2>&1; then
  codex
else
  echo "Codex n'est pas detecte dans le PATH."
  echo "Essaie de fermer/reouvrir Terminal ou relance l'installateur."
  echo "Commande de secours:"
  echo "curl -fsSL https://chatgpt.com/codex/install.sh | sh"
  read "?Appuie sur Entree pour fermer..."
fi
EOF

chmod +x "$DESKTOP_LAUNCHER"
ok "Raccourci cree: $DESKTOP_LAUNCHER"

step "Verification finale"

check_cmd() {
  local cmd="$1"
  local label="$2"

  if command_exists "$cmd"; then
    local version
    version="$($cmd --version 2>/dev/null | head -n 1 || echo detecte)"
    ok "$label: $version"
  else
    warn "$label non detecte dans cette session."
  fi
}

check_cmd git "Git"
check_cmd code "VS Code CLI"
check_cmd node "Node.js"
check_cmd npm "npm"
check_cmd python3 "Python"
check_cmd gh "GitHub CLI"
check_cmd codex "Codex CLI"

step "Resultat"

if [[ "$CODEX_INSTALLED" == "true" ]]; then
  ok "Environnement pret. Le client peut ouvrir 'Demarrer Codex.command' sur le Bureau."
  echo ""
  echo "Installation terminee."
  echo "Rapport: $REPORT_PATH"
  echo ""
  read "?Appuie sur Entree pour fermer..."
  exit 0
else
  warn "La base est installee, mais Codex CLI n'a pas ete detecte."
  warn "Relance ce fichier apres reouverture de Terminal, ou lance:"
  echo "curl -fsSL https://chatgpt.com/codex/install.sh | sh"
  echo ""
  echo "Rapport: $REPORT_PATH"
  read "?Appuie sur Entree pour fermer..."
  exit 2
fi
