#!/bin/sh
# ================================================================
#  SSClash Auto-Installer — ЗЕРКАЛО geodema (без GitHub)
#  Оригинал: https://github.com/zerolabnet/SSClash
#  Пропатчено: версия и файлы тянутся с files.geodema.network,
#  т.к. raw/objects.githubusercontent.com заблокированы из РФ.
# ================================================================

MIRROR="http://files.geodema.network"
MIHOMO_BASE="https://github.com/MetaCubeX/mihomo/releases"   # только для подсказок в тексте
CLASH_BIN="/opt/clash/bin/clash"

SSCLASH_VER=""
SSCLASH_APK_URL=""
SSCLASH_IPK_URL=""
PKG_UPDATED=0

# -- снять прошлый clash (его TUN перехватывает загрузки -> wget Operation not permitted) --
[ -x /etc/init.d/clash ] && /etc/init.d/clash stop 2>/dev/null
ip link del clash-tun 2>/dev/null
/etc/init.d/firewall restart >/dev/null 2>&1
sleep 1

# ── цвета ───────────────────────────────────────────────────────
if [ -t 1 ] && [ "${TERM:-dumb}" != "dumb" ]; then
    R=$(printf '\033[0;31m') G=$(printf '\033[0;32m') Y=$(printf '\033[1;33m')
    C=$(printf '\033[0;36m') B=$(printf '\033[1m')    N=$(printf '\033[0m')
else
    R='' G='' Y='' C='' B='' N=''
fi
log()  { printf "%s[+]%s %s\n" "$G" "$N" "$*"; }
info() { printf "%s[i]%s %s\n" "$C" "$N" "$*"; }
warn() { printf "%s[!]%s %s\n" "$Y" "$N" "$*"; }
die()  { printf "%s[✗] %s%s\n" "$R" "$*" "$N" >&2; exit 1; }
sep()  { printf "%s%s%s\n"     "$C" "────────────────────────────────────────" "$N"; }

# ================================================================
#  0. Гарантируем наличие curl
# ================================================================
ensure_curl() {
    if command -v curl >/dev/null 2>&1; then
        info "curl: уже установлен ($(curl --version | head -1 | cut -d' ' -f1-2))"
        return 0
    fi
    warn "curl не найден — устанавливаю..."
    if [ "$PKG_MGR" = "apk" ]; then
        apk update  || die "apk update завершился с ошибкой"
        apk add curl || die "Не удалось установить curl"
    else
        opkg update  || die "opkg update завершился с ошибкой"
        opkg install curl || die "Не удалось установить curl"
    fi
    command -v curl >/dev/null 2>&1 || die "curl всё равно недоступен после установки"
    log "curl установлен"
    PKG_UPDATED=1
}

# ================================================================
#  1. Версия OpenWrt и пакетный менеджер
# ================================================================
detect_openwrt() {
    [ -f /etc/openwrt_release ] || die "Не найден /etc/openwrt_release — это OpenWrt?"
    . /etc/openwrt_release
    OW_RELEASE="${DISTRIB_RELEASE:-unknown}"
    OW_MAJOR=$(echo "$OW_RELEASE" | cut -d. -f1)
    info "OpenWrt: ${B}${OW_RELEASE}${N}"
    if [ "${OW_MAJOR:-0}" -ge 25 ] 2>/dev/null; then
        PKG_MGR="apk"
    else
        PKG_MGR="opkg"
    fi
    info "Пакетный менеджер: ${B}${PKG_MGR}${N}"
    if [ "${OW_MAJOR:-0}" -le 21 ] 2>/dev/null; then
        TPROXY_PKG="iptables-mod-tproxy"
    else
        TPROXY_PKG="kmod-nft-tproxy"
    fi
    info "Пакет tproxy: ${B}${TPROXY_PKG}${N}"
}

# ================================================================
#  2. Определение архитектуры → имя файла ядра mihomo
# ================================================================
detect_arch() {
    ARCH_RAW=$(uname -m)
    . /etc/openwrt_release
    TARGET="${DISTRIB_TARGET:-}"
    info "CPU (uname -m): ${B}${ARCH_RAW}${N}"
    info "OpenWrt target: ${B}${TARGET}${N}"
    case "$ARCH_RAW" in
        aarch64)      MIHOMO_ARCH="arm64" ;;
        armv7l|armv6l) MIHOMO_ARCH="armv7" ;;
        mips)         MIHOMO_ARCH="mips-softfloat" ;;
        mipsel)       MIHOMO_ARCH="mipsle-softfloat" ;;
        x86_64)       MIHOMO_ARCH="amd64-compatible" ;;
        i686|i386)    MIHOMO_ARCH="386" ;;
        *)
            warn "Неизвестная архитектура: ${ARCH_RAW}"
            warn "Доступные ядра: ${MIRROR}/mihomo/"
            MIHOMO_ARCH=""
            ;;
    esac
    if [ -n "$MIHOMO_ARCH" ]; then
        info "Ядро mihomo: ${B}mihomo-linux-${MIHOMO_ARCH}${N}"
    fi
}

# ================================================================
#  3. Обновление индекса пакетов
# ================================================================
pkg_update() {
    if [ "$PKG_UPDATED" = "1" ]; then
        info "Индекс пакетов уже обновлён — пропускаю"
        return 0
    fi
    log "Обновление списка пакетов..."
    if [ "$PKG_MGR" = "apk" ]; then
        apk update || die "apk update завершился с ошибкой"
    else
        opkg update || die "opkg update завершился с ошибкой"
    fi
    PKG_UPDATED=1
}

# ================================================================
#  4. Установка зависимостей
# ================================================================
install_deps() {
    log "Установка зависимостей: curl ${TPROXY_PKG} kmod-tun coreutils-base64"
    if [ "$PKG_MGR" = "apk" ]; then
        apk add curl "$TPROXY_PKG" kmod-tun coreutils-base64 \
            || die "Ошибка установки зависимостей"
    else
        opkg install curl "$TPROXY_PKG" kmod-tun coreutils-base64 \
            || die "Ошибка установки зависимостей"
    fi
}

# ================================================================
#  5а. Версия/URL SSClash — С ЗЕРКАЛА (без GitHub API)
# ================================================================
fetch_ssclash_release() {
    SSCLASH_VER="4.5.2"
    SSCLASH_IPK_URL="${MIRROR}/ssclash/luci-app-ssclash_4.5.2-r1_all.ipk"
    SSCLASH_APK_URL="${MIRROR}/ssclash/luci-app-ssclash-4.5.2-r1.apk"
    info "SSClash: ${B}v${SSCLASH_VER}${N} (зеркало geodema)"
    if [ "$PKG_MGR" = "apk" ]; then
        info "Пакет: ${B}${SSCLASH_APK_URL##*/}${N}"
    else
        info "Пакет: ${B}${SSCLASH_IPK_URL##*/}${N}"
    fi
}

# ================================================================
#  5б. Установка luci-app-ssclash
# ================================================================
install_ssclash() {
    log "Загрузка luci-app-ssclash v${SSCLASH_VER}..."
    if [ "$PKG_MGR" = "apk" ]; then
        PKG_FILE="/tmp/luci-app-ssclash.apk"
        curl -L "$SSCLASH_APK_URL" -o "$PKG_FILE" || die "Ошибка загрузки .apk"
        log "Установка пакета..."
        apk add --allow-untrusted "$PKG_FILE" || die "Ошибка установки .apk"
        rm -f /tmp/*.apk
    else
        PKG_FILE="/tmp/luci-app-ssclash.ipk"
        curl -L "$SSCLASH_IPK_URL" -o "$PKG_FILE" || die "Ошибка загрузки .ipk"
        log "Установка пакета..."
        (cd /tmp && opkg install luci-app-ssclash.ipk) || die "Ошибка установки .ipk"
        rm -f /tmp/*.ipk
    fi
}

# ================================================================
#  6. Загрузка и установка ядра mihomo — С ЗЕРКАЛА
# ================================================================
install_mihomo() {
    if [ -z "$MIHOMO_ARCH" ]; then
        warn "Архитектура не определена автоматически."
        warn "Вручную скачай ядро: ${MIRROR}/mihomo/"
        return 0
    fi
    info "Ядро mihomo с зеркала geodema (v1.19.27)"
    MIHOMO_URL="${MIRROR}/mihomo/mihomo-linux-${MIHOMO_ARCH}.gz"
    info "URL: ${MIHOMO_URL}"
    log "Загрузка ядра mihomo..."
    curl -L "$MIHOMO_URL" -o /tmp/clash.gz || die "Ошибка загрузки ядра mihomo"
    log "Распаковка в ${CLASH_BIN}..."
    mkdir -p "$(dirname "$CLASH_BIN")"
    gunzip -c /tmp/clash.gz > "$CLASH_BIN" || die "Ошибка распаковки"
    chmod +x "$CLASH_BIN"
    rm -f /tmp/clash.gz
    if [ -f "/opt/clash/bin/meta-backup" ]; then
        log "Удаляю резервную копию ядра mihomo..."
        rm -f /opt/clash/bin/meta-backup
    fi
    log "Ядро установлено: $("$CLASH_BIN" -v 2>/dev/null || echo 'версия доступна после запуска сервиса')"
}

# ================================================================
#  MAIN
# ================================================================
sep
printf "  ${B}SSClash Auto-Installer (зеркало geodema)${N}\n"
sep

detect_openwrt
ensure_curl
detect_arch
fetch_ssclash_release
sep

pkg_update
sep

install_deps
sep

CLASH_WAS_ENABLED=0
if [ -x /etc/init.d/clash ] && /etc/init.d/clash enabled 2>/dev/null; then
    CLASH_WAS_ENABLED=1
    info "Сервис clash был включён — состояние будет восстановлено"
fi

install_ssclash

if [ "$CLASH_WAS_ENABLED" = "1" ] && [ -x /etc/init.d/clash ]; then
    log "Восстанавливаю автозапуск сервиса clash..."
    /etc/init.d/clash enable
fi
sep

if [ -x /etc/init.d/clash ] && pidof clash >/dev/null 2>&1; then
    warn "Сервис clash запущен — останавливаю перед загрузкой ядра..."
    /etc/init.d/clash stop
fi

install_mihomo
sep

log "${G}Установка завершена!${N}"
echo ""
info "Дальше:"
echo "  1. Залей подписку:"
echo "     wget --no-proxy -O /opt/clash/config.yaml \"ССЫЛКА_ПОДПИСКИ/mihomo\""
echo "  2. /etc/init.d/clash enable && /etc/init.d/clash restart"
echo "  3. Панель: LuCI → Services → SSClash → Dashboard"
sep
