#!/bin/bash
set -e

# ==========================================
# КОНФИГУРАЦИЯ
# ==========================================
# URL актуальной ветки LVC (Linux Verification Center)
# Используем стабильную ветку 6.12, так как она LTS и наиболее надежна для Mint
KERNEL_URL="https://git.linuxtesting.ru/pub/scm/linux/kernel/git/lvc/linux-stable.git/snapshot/linux-stable-6.12.57-lvc6.tar.gz"
KERNEL_DIR_NAME="linux-stable-6.12.57-lvc6"
CUSTOM_SUFFIX="-lvc-green"
OUTPUT_DIR="$HOME/kernel-builds"
BUILD_THREADS=$(nproc)

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

# ==========================================
# ПРЕДВАРИТЕЛЬНЫЕ ПРОВЕРКИ
# ==========================================

echo -e "${GREEN}[1/7] Проверка окружения...${NC}"

# Проверка свободного места (нужно минимум 15ГБ для полной сборки)
FREE_SPACE=$(df -k . | awk 'NR==2 {print $4}')
if [ "$FREE_SPACE" -lt 15000000 ]; then
    echo -e "${RED}Ошибка: Недостаточно места на диске. Требуется минимум 15 ГБ.${NC}"
    exit 1
fi

echo -e "${GREEN}Установка зависимостей...${NC}"
sudo apt-get update
sudo apt-get install -y \
    build-essential fakeroot libncurses-dev libssl-dev ccache \
    flex bison libelf-dev dwarves zstd \
    debhelper dpkg-dev bc rsync \
    cpio kmod lz4 pciutils usbutils \
    git openssl ca-certificates wget curl

# ==========================================
# УСТАНОВКА СЕРТИФИКАТОВ МИНЦИФРЫ
# ==========================================

echo -e "${GREEN}[1.5/7] Установка сертификатов Минцифры...${NC}"
echo -e "${YELLOW}Необходимо для доступа к git.linuxtesting.ru без ошибок SSL${NC}"

# Создаем временную папку
CERT_TMP=$(mktemp -d)

# Скачиваем сертификаты (используем --no-check-certificate, чтобы скачать сами сертификаты)
wget --no-check-certificate -q -O "$CERT_TMP/russian_trusted_root_ca.crt" https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt
wget --no-check-certificate -q -O "$CERT_TMP/russian_trusted_sub_ca.crt" https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt

# Проверяем успешность скачивания
if [ -s "$CERT_TMP/russian_trusted_root_ca.crt" ]; then
    echo "Сертификаты загружены, установка в систему..."
    
    # Копируем в системное хранилище
    sudo cp "$CERT_TMP/russian_trusted_root_ca.crt" /usr/local/share/ca-certificates/
    sudo cp "$CERT_TMP/russian_trusted_sub_ca.crt" /usr/local/share/ca-certificates/
    
    # Обновляем список доверенных сертификатов
    sudo update-ca-certificates
else
    echo -e "${RED}Не удалось скачать сертификаты. Проверьте интернет-соединение.${NC}"
    # Не прерываем выполнение, попробуем скачать ядро с --no-check-certificate если это не поможет
fi

rm -rf "$CERT_TMP"

# ==========================================
# ПОДГОТОВКА РАБОЧЕЙ ДИРЕКТОРИИ
# ==========================================

mkdir -p "$OUTPUT_DIR"
WORKDIR=$(mktemp -d)
echo -e "${YELLOW}Рабочая директория: $WORKDIR${NC}"

# Перехват ошибок для очистки (опционально, сейчас закомментировано для отладки)
# trap 'rm -rf "$WORKDIR"' EXIT

cd "$WORKDIR"

# ==========================================
# ЗАГРУЗКА И РАСПАКОВКА
# ==========================================

echo -e "${GREEN}[2/7] Загрузка ядра LVC...${NC}"
if [ ! -f "$OUTPUT_DIR/kernel_source.tar.gz" ]; then
    # Добавлен флаг --no-check-certificate как запасной вариант, если update-ca-certificates не сработал сразу для wget
    wget --show-progress --no-check-certificate -O kernel.tar.gz "$KERNEL_URL"
else
    echo "Использование кэшированного архива..."
    cp "$OUTPUT_DIR/kernel_source.tar.gz" kernel.tar.gz
fi

echo -e "${GREEN}[3/7] Распаковка...${NC}"
tar -xf kernel.tar.gz
cd "$KERNEL_DIR_NAME"

# ==========================================
# НАСТРОЙКА КОНФИГУРАЦИИ (КЛЮЧЕВОЙ ЭТАП)
# ==========================================

echo -e "${GREEN}[4/7] Создание конфигурации на основе текущей системы...${NC}"

# 1. Копируем конфиг текущего ядра Mint/Ubuntu
# Это гарантирует поддержку 99% оборудования (звук, wifi, bluetooth, видео)
cp "/boot/config-$(uname -r)" .config

# 2. Отключаем ключи подписи Canonical/Debian, которых у нас нет
# Без этого сборка упадет с ошибкой "No rule to make target..."
scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
scripts/config --set-str SYSTEM_REVOCATION_KEYS ""

# 3. Отключаем подпись модулей, так как у нас нет закрытого ключа
scripts/config --disable MODULE_SIG
scripts/config --disable MODULE_SIG_ALL
scripts/config --disable MODULE_SIG_KEY

# 4. Оптимизация размера и скорости (ОЧЕНЬ ВАЖНО)
# Отключаем отладочную информацию, иначе пакеты будут весить по 500МБ+
scripts/config --disable DEBUG_INFO
scripts/config --disable DEBUG_INFO_BTF
scripts/config --disable DEBUG_INFO_DWARF4
scripts/config --disable DEBUG_INFO_DWARF5

# 5. Применяем настройки LVC и оптимизации производительности
scripts/config --set-str CONFIG_LOCALVERSION "$CUSTOM_SUFFIX"
scripts/config --enable CONFIG_PREEMPT_VOLUNTARY  # Лучшая отзывчивость десктопа
scripts/config --enable CONFIG_HZ_1000            # Низкая задержка
scripts/config --enable CONFIG_MQ_IOSCHED_KYBER   # Быстрый I/O планировщик
scripts/config --enable CONFIG_X86_AMD_PSTATE     # Для современных AMD CPU
scripts/config --enable CONFIG_INTEL_PSTATE       # Для современных Intel CPU

# 6. Обновляем конфиг под новую версию ядра
echo -e "${YELLOW}Адаптация старого конфига под новое ядро (нажмите Enter если спросит)...${NC}"
yes "" | make olddefconfig

# ==========================================
# СБОРКА
# ==========================================

echo -e "${GREEN}[5/7] Компиляция ядра ($BUILD_THREADS потоков)...${NC}"
echo -e "${YELLOW}Это может занять от 20 минут до нескольких часов.${NC}"

# Очистка перед сборкой
make clean

# Сборка deb-пакетов
# KDEB_PKGVERSION задает версию пакета для apt
make -j"$BUILD_THREADS" bindeb-pkg \
    KDEB_PKGVERSION="$(make kernelversion)-1" \
    LOCALVERSION="" \
    DEB_BUILD_OPTIONS="parallel=$BUILD_THREADS nocheck"

# ==========================================
# ЗАВЕРШЕНИЕ
# ==========================================

echo -e "${GREEN}[6/7] Перенос файлов...${NC}"
cd ..
mv *.deb "$OUTPUT_DIR/"
mv *.changes "$OUTPUT_DIR/" 2>/dev/null || true
mv *.buildinfo "$OUTPUT_DIR/" 2>/dev/null || true

echo -e "${GREEN}[7/7] Готово!${NC}"
echo -e "Файлы находятся в: ${YELLOW}$OUTPUT_DIR${NC}"
ls -lh "$OUTPUT_DIR"/*.deb

echo -e "\n${YELLOW}Для установки выполните:${NC}"
echo "cd $OUTPUT_DIR"
echo "sudo dpkg -i linux-image*header*.deb linux-image*image*.deb linux-headers*.deb"
echo "sudo update-grub"
echo "sudo reboot"

# Очистка временной директории
# rm -rf "$WORKDIR"