#!/usr/bin/env bash
set -e

# Цвета для вывода
GREEN='\033[1;32m'
BLUE='\033[1;34m'
YELLOW='\033[1;33m'
RED='\033[1;31m'
NC='\033[0m'

info()  { echo -e "\n${BLUE}===> $1${NC}"; }
ok()    { echo -e "${GREEN}[OK] $1${NC}"; }
warn()  { echo -e "${YELLOW}[!] $1${NC}"; }
err()   { echo -e "${RED}[ОШИБКА] $1${NC}"; exit 1; }

# 0. Проверка прав
if [ "$EUID" -ne 0 ]; then
    echo -e "${YELLOW}Запрос прав администратора (sudo)...${NC}"
    exec sudo -E bash "$0" "$@"
fi

# Определяем реального пользователя
REAL_USER="${SUDO_USER:-$(logname 2>/dev/null || echo user)}"
REAL_UID=$(id -u "$REAL_USER" 2>/dev/null || echo 1000)
REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)
[ -z "$REAL_HOME" ] && REAL_HOME="/home/$REAL_USER"

USB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# Параметры прокси ЕСПД (уточните IP для вашего региона)
PROXY_HOST="10.0.57.52"
PROXY_PORT="3128"
PROXY_URL="http://${PROXY_HOST}:${PROXY_PORT}"

echo -e "${GREEN}======================================================${NC}"
echo -e "${GREEN}   Установка и настройка ЕСПД для МЭШ ОС (МОС12)      ${NC}"
echo -e "${GREEN}======================================================${NC}"
echo "Пользователь: $REAL_USER ($REAL_HOME)"
echo "Папка с файлами: $USB_DIR"

# ----------------------------------------------------------------------
# ЭТАП 1. Настройка системного прокси KDE (с исключением localhost)
# ----------------------------------------------------------------------
info "Этап 1/3: Настройка прокси KDE (исключение localhost для АРМ ГИА)..."

KIOSLAVERC="$REAL_HOME/.config/kioslaverc"
mkdir -p "$REAL_HOME/.config"

# Функция записи ключей KDE
write_kde_proxy() {
    local key="$1"
    local value="$2"
    if command -v kwriteconfig5 >/dev/null 2>&1; then
        sudo -u "$REAL_USER" kwriteconfig5 --file "$KIOSLAVERC" --group "Proxy Settings" --key "$key" "$value"
    elif command -v kwriteconfig6 >/dev/null 2>&1; then
        sudo -u "$REAL_USER" kwriteconfig6 --file "$KIOSLAVERC" --group "Proxy Settings" --key "$key" "$value"
    else
        return 1
    fi
}

if ! write_kde_proxy "ProxyType" "1" 2>/dev/null; then
    warn "Утилиты kwriteconfig не найдены, используется прямая запись."
    cat <<EOF > "$KIOSLAVERC"
[Proxy Settings]
ProxyType=1
httpProxy=http://${PROXY_HOST}:${PROXY_PORT}
httpsProxy=http://${PROXY_HOST}:${PROXY_PORT}
ftpProxy=
socksProxy=
NoProxyFor=localhost,127.0.0.1,::1
ReversedException=false
EOF
    chown "$REAL_USER:$REAL_USER" "$KIOSLAVERC"
else
    # Важно: формат host:port (двоеточие), а не пробел
    write_kde_proxy "httpProxy" "http://${PROXY_HOST}:${PROXY_PORT}"
    write_kde_proxy "httpsProxy" "http://${PROXY_HOST}:${PROXY_PORT}"
    write_kde_proxy "ftpProxy" ""
    write_kde_proxy "socksProxy" ""
    # Критически важно: исключаем localhost, чтобы не сломать CPD АРМ ГИА-11
    write_kde_proxy "NoProxyFor" "localhost,127.0.0.1,::1"
    write_kde_proxy "ReversedException" "false"
fi

# Применяем настройки KDE
sudo -u "$REAL_USER" \
    DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$REAL_UID/bus" \
    dbus-send --type=signal /KIO/Scheduler org.kde.KIO.Scheduler.reparseSlaveConfiguration string:'' >/dev/null 2>&1 || true

# Перезапуск kded для гарантированного применения (если доступен)
if command -v kded5 >/dev/null 2>&1; then
    sudo -u "$REAL_USER" DISPLAY="${DISPLAY:-:0}" kded5 --replace >/dev/null 2>&1 &
elif command -v kded6 >/dev/null 2>&1; then
    sudo -u "$REAL_USER" DISPLAY="${DISPLAY:-:0}" kded6 --replace >/dev/null 2>&1 &
fi

ok "Прокси KDE настроен. localhost/127.0.0.1 исключены из проксирования."

# ----------------------------------------------------------------------
# ЭТАП 2. Установка сертификата Ростелеком
# ----------------------------------------------------------------------
info "Этап 2/3: Установка корневого сертификата Ростелеком..."

CERT_FILE=$(find "$USB_DIR" -maxdepth 2 -type f \( -iname "ca-root.crt" -o -iname "ca-root.cer" -o -iname "ca-root.pem" \) -print -quit)
[ -z "$CERT_FILE" ] && err "Файл сертификата ca-root.crt не найден в $USB_DIR"

# 2.1 Системное хранилище (стандартный путь для RPM-систем)
mkdir -p /etc/pki/ca-trust/source/anchors/
cp -f "$CERT_FILE" /etc/pki/ca-trust/source/anchors/ca-root.crt
chmod 644 /etc/pki/ca-trust/source/anchors/ca-root.crt
if command -v update-ca-trust >/dev/null 2>&1; then
    update-ca-trust extract
    ok "Сертификат добавлен в системное хранилище."
else
    warn "Команда update-ca-trust не найдена. Проверьте путь к сертификатам вручную."
fi

# 2.2 Копия в Загрузки пользователя
USER_DOWNLOADS="$REAL_HOME/Загрузки"
[ ! -d "$USER_DOWNLOADS" ] && USER_DOWNLOADS="$REAL_HOME/Downloads"
if [ -d "$USER_DOWNLOADS" ]; then
    cp -f "$CERT_FILE" "$USER_DOWNLOADS/ca-root.crt"
    chown "$REAL_USER:$REAL_USER" "$USER_DOWNLOADS/ca-root.crt"
fi

# 2.3 Импорт в NSS (Chromium) — критически важно для браузера
NSSDB_DIR="$REAL_HOME/.pki/nssdb"
sudo -u "$REAL_USER" mkdir -p "$NSSDB_DIR"

if command -v certutil >/dev/null 2>&1; then
    if [ ! -f "$NSSDB_DIR/cert9.db" ]; then
        sudo -u "$REAL_USER" certutil -d sql:"$NSSDB_DIR" -N --empty-password >/dev/null 2>&1 || true
    fi
    sudo -u "$REAL_USER" certutil -d sql:"$NSSDB_DIR" -D -n "CA Root Social Objects" >/dev/null 2>&1 || true
    sudo -u "$REAL_USER" certutil -d sql:"$NSSDB_DIR" -A -t "C,," -n "CA Root Social Objects" -i "$CERT_FILE"
    ok "Сертификат импортирован в Chromium (NSS)."
else
    warn "Утилита certutil не найдена. Попытка установки nss-utils через dnf..."
    dnf install -y nss-utils 2>/dev/null || true
    if command -v certutil >/dev/null 2>&1; then
        sudo -u "$REAL_USER" certutil -d sql:"$NSSDB_DIR" -A -t "C,," -n "CA Root Social Objects" -i "$CERT_FILE"
        ok "Сертификат импортирован в Chromium (NSS)."
    else
        warn "Не удалось установить certutil. Браузер может не доверять сертификату."
    fi
fi

# ----------------------------------------------------------------------
# ЭТАП 3. Установка пакетов и настройка прокси для DNF
# ----------------------------------------------------------------------
info "Этап 3/3: Установка пакетов и настройка DNF..."

SWITCH_RPM=$(find "$USB_DIR" -maxdepth 2 -type f -iname "python3-pyqt6-switch-control*.rpm" -print -quit)
ESPD_RPM=$(find "$USB_DIR" -maxdepth 2 -type f -iname "espd-proxy*.rpm" -print -quit)

[ -z "$SWITCH_RPM" ] && err "Не найден пакет python3-pyqt6-switch-control*.rpm"
[ -z "$ESPD_RPM" ] && err "Не найден пакет espd-proxy*.rpm"

# Установка через dnf (основной менеджер МОС12)
info "Установка python3-pyqt6-switch-control..."
if ! dnf install -y "$SWITCH_RPM" 2>/dev/null; then
    warn "dnf install не удался, пробуем rpm -Uvh..."
    rpm -Uvh --replacepkgs --oldpackage "$SWITCH_RPM" || err "Не удалось установить switch-control"
fi

info "Установка espd-proxy..."
if ! dnf install -y "$ESPD_RPM" 2>/dev/null; then
    warn "dnf install не удался, пробуем rpm -Uvh..."
    rpm -Uvh --replacepkgs --oldpackage "$ESPD_RPM" || err "Не удалось установить espd-proxy"
fi
ok "Пакеты установлены."

# Настройка прокси для DNF
info "Настройка прокси для DNF (/etc/dnf/dnf.conf)..."
if grep -q "^proxy=" /etc/dnf/dnf.conf 2>/dev/null; then
    sed -i "s|^proxy=.*|proxy=${PROXY_URL}|" /etc/dnf/dnf.conf
else
    echo "proxy=${PROXY_URL}" >> /etc/dnf/dnf.conf
fi

# Настройка Wget
if [ -f /etc/wgetrc ]; then
    sed -i '/^#*http_proxy/d; /^#*https_proxy/d; /^#*use_proxy/d' /etc/wgetrc
    cat <<EOF >> /etc/wgetrc
http_proxy = ${PROXY_URL}/
https_proxy = ${PROXY_URL}/
use_proxy = on
EOF
fi

# Запуск espd-proxy
if command -v espd-proxy >/dev/null 2>&1; then
    info "Запуск Конфигуратора прокси (espd-proxy)..."
    warn "В открывшемся окне выберите регион, отметьте настройки dnf/wget и включите тумблер."
    sudo -u "$REAL_USER" \
        DISPLAY="${DISPLAY:-:0}" \
        XAUTHORITY="${XAUTHORITY:-$REAL_HOME/.Xauthority}" \
        DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$REAL_UID/bus" \
        espd-proxy >/dev/null 2>&1 &
fi

echo -e "\n${GREEN}======================================================${NC}"
echo -e "${GREEN}   НАСТРОЙКА ЕСПД ДЛЯ МЭШ ОС ЗАВЕРШЕНА!              ${NC}"
echo -e "${GREEN}======================================================${NC}"
echo -e "${YELLOW}ВАЖНО: Если используется АРМ ГИА-11, проверьте:${NC}"
echo "  curl http://localhost:7080/api/status"
echo "  Если ошибка — убедитесь, что прокси не перехватывает localhost."