#!/usr/bin/env bash
# =====================================================================
#  Pack de plugins 0zhx - installation Linux
#
#  Equivalent Linux du 0zhx-install.ps1 (Windows). Ce script :
#   1. ferme Discord
#   2. injecte Equicord (EquilotlCli-linux, officiel)
#   3. remplace l'asar par le build 0zhx (les plugins)
#   4. active TOUS les plugins 0zhx (roster pre-configure)
#   5. coupe la mise a jour auto d'Equicord (sinon elle ecrase le pack)
#   6. relance Discord
#
#  Vos reglages existants ne sont PAS ecrases : ils sont sauvegardes
#  et les plugins 0zhx sont simplement ajoutes/actives par-dessus.
#
#  Usage : bash 0zhx-install.sh
#     ou : curl -fsSL https://0zhx.com/ozhxcord/0zhx-install.sh | bash
# =====================================================================

BASE="https://0zhx.com/ozhxcord"
CFG="${XDG_CONFIG_HOME:-$HOME/.config}"
EQ="$CFG/Equicord"

say()  { printf '\n\033[36m>> %s\033[0m\n' "$1"; }
ok()   { printf '   \033[32m%s\033[0m\n' "$1"; }
warn() { printf '   \033[33m%s\033[0m\n' "$1"; }
die()  { printf '\n\033[31m[ERREUR] %s\033[0m\n' "$1"; exit 1; }

printf '\033[35m=====  Pack de plugins 0zhx (Linux)  =====\033[0m\n'

command -v curl >/dev/null 2>&1 || die "curl est requis. Installe-le (sudo apt install curl) puis relance."

# --- 1. reperer les Discord installes --------------------------------
say "Recherche de Discord..."
declare -A CDIR=( [stable]=discord [canary]=discordcanary [ptb]=discordptb )
found=()
for b in stable canary ptb; do
    [ -d "$CFG/${CDIR[$b]}" ] && found+=("$b")
done
flat=""
if command -v flatpak >/dev/null 2>&1 && flatpak info com.discordapp.Discord >/dev/null 2>&1; then
    flat="yes"
fi
if [ ${#found[@]} -eq 0 ] && [ -z "$flat" ]; then
    die "Discord introuvable. Installe Discord (.deb ou .tar.gz depuis discord.com) puis relance."
fi
[ ${#found[@]} -gt 0 ] && ok "trouve : ${found[*]}"
[ -n "$flat" ] && warn "Discord Flatpak detecte : support limite (voir la note en fin de script)."

# --- 2. fermer Discord -----------------------------------------------
say "Fermeture de Discord..."
for p in Discord DiscordCanary DiscordPTB; do
    pkill -x "$p" >/dev/null 2>&1 || true
done
sleep 2
ok "ferme"

# --- 3. injection d'Equicord (Equilotl officiel) ---------------------
say "Installation d'Equicord..."
CLI="$(mktemp "${TMPDIR:-/tmp}/EquilotlCli-linux.XXXXXX")"
curl -fsSL -o "$CLI" "https://github.com/Equicord/Equilotl/releases/latest/download/EquilotlCli-linux" \
    || die "telechargement d'Equilotl echoue (verifie ta connexion)."
chmod +x "$CLI"
if [ ${#found[@]} -gt 0 ]; then
    for b in "${found[@]}"; do
        if "$CLI" -install -branch "$b" >/dev/null 2>&1; then
            ok "branche sur $b"
        else
            warn "$b n'a pas pu etre modifie, on continue"
        fi
    done
else
    "$CLI" -install -branch auto >/dev/null 2>&1 && ok "branche (auto)" || warn "injection auto incertaine, on continue"
fi
rm -f "$CLI"
sleep 1

# --- 4. remplacer l'asar par le pack 0zhx ----------------------------
#  Apres l'injection : l'installeur officiel pose l'asar standard,
#  on le remplace par celui d'0zhx (avec les plugins).
say "Installation des plugins 0zhx..."
mkdir -p "$EQ/settings"
ASAR="$EQ/equicord.asar"
[ -f "$ASAR" ] && cp -f "$ASAR" "$ASAR.avant-0zhx" 2>/dev/null || true
tmpasar="$(mktemp "${TMPDIR:-/tmp}/0zhx-plugins.asar.XXXXXX")"
curl -fsSL -o "$tmpasar" "$BASE/equicord-plugins.asar" || die "telechargement des plugins echoue."
sz=$(stat -c%s "$tmpasar" 2>/dev/null || echo 0)
[ "$sz" -lt 5000000 ] && { rm -f "$tmpasar"; die "le telechargement des plugins a echoue (fichier trop petit)."; }
mv -f "$tmpasar" "$ASAR"
ok "installe ($(( sz / 1048576 )) Mo)"

# --- 5. activer les plugins 0zhx + couper la mise a jour auto --------
#  - pas de settings existant -> on depose le roster complet
#  - settings deja present     -> on FUSIONNE (on active les plugins
#    0zhx par-dessus les siens, sans rien supprimer) apres backup.
say "Activation des plugins 0zhx..."
SF="$EQ/settings/settings.json"
roster="$(mktemp "${TMPDIR:-/tmp}/0zhx-settings.json.XXXXXX")"
if ! curl -fsSL -o "$roster" "$BASE/equicord-settings.0zhx.json"; then
    warn "liste des plugins indisponible - active-les a la main (Reglages > Plugins)"
    roster=""
fi

if [ -n "$roster" ] && [ -f "$SF" ]; then
    cp -f "$SF" "$SF.avant-0zhx" 2>/dev/null || true
    if command -v python3 >/dev/null 2>&1; then
        python3 - "$SF" "$roster" <<'PY'
import json, sys
sf, rf = sys.argv[1], sys.argv[2]
try:
    cur = json.load(open(sf, encoding="utf-8"))
    if not isinstance(cur, dict): cur = {}
except Exception:
    cur = {}
my = json.load(open(rf, encoding="utf-8")).get("plugins", {})
cur.setdefault("plugins", {})
for name, val in my.items():
    e = cur["plugins"].get(name)
    if isinstance(e, dict):
        e["enabled"] = True
    else:
        cur["plugins"][name] = {"enabled": True}
cur["autoUpdate"] = False
cur["autoUpdateNotification"] = False
# UTF-8 SANS BOM (Equicord lit en utf-8 et un BOM casserait le JSON.parse)
with open(sf, "w", encoding="utf-8") as f:
    json.dump(cur, f, ensure_ascii=False, indent=2)
PY
        ok "plugins 0zhx actives (tes reglages existants conserves)"
    elif command -v jq >/dev/null 2>&1; then
        tmp="$(mktemp)"
        jq --slurpfile r "$roster" '.plugins = ((.plugins // {}) * ($r[0].plugins)) | .autoUpdate = false | .autoUpdateNotification = false' "$SF" > "$tmp" \
            && mv -f "$tmp" "$SF" && ok "plugins 0zhx actives (tes reglages existants conserves)" \
            || warn "fusion impossible, reglages laisses intacts"
    else
        warn "python3/jq absents : active les plugins a la main (Reglages > Plugins)"
        sed -i -E 's/"autoUpdate"[[:space:]]*:[[:space:]]*true/"autoUpdate": false/; s/"autoUpdateNotification"[[:space:]]*:[[:space:]]*true/"autoUpdateNotification": false/' "$SF" 2>/dev/null || true
    fi
    ok "mise a jour auto desactivee (elle ecraserait les plugins)"
elif [ -n "$roster" ]; then
    cp -f "$roster" "$SF"
    ok "plugins 0zhx actives"
    ok "mise a jour auto desactivee (elle ecraserait les plugins)"
fi
[ -n "$roster" ] && rm -f "$roster"

# --- 6. relancer (best effort) ---------------------------------------
say "Relance de Discord..."
relaunched=""
if [ ${#found[@]} -gt 0 ]; then
    case "${found[0]}" in
        canary) bin=discord-canary ;;
        ptb)    bin=discord-ptb ;;
        *)      bin=discord ;;
    esac
    if command -v "$bin" >/dev/null 2>&1; then
        nohup "$bin" >/dev/null 2>&1 & disown 2>/dev/null || true
        relaunched="yes"
        ok "relance ($bin)"
    fi
fi
[ -z "$relaunched" ] && warn "rouvre Discord toi-meme."

printf '\n\033[32m=====  TERMINE  =====\033[0m\n'
ok "Ouvre Discord : tous les plugins 0zhx sont deja actives."
ok "(Reglages > Plugins si tu veux en desactiver certains.)"
[ -n "$flat" ] && warn "Flatpak : si les plugins n'apparaissent pas, il faut autoriser l'acces au dossier (flatpak override) - previens 0zhx."
