#!/bin/bash

# =============================================================
# SSD Repair Script (ext4/auto) - Proxmox Edition (Final)
# =============================================================
# 🔙 Обратно към статията:
# https://itpraktika.com/proxmox-ssd-read-only-fix/

MOUNT_POINT="/mnt/backup"
DEVICE="/dev/sda1"
LOG_FILE="repair.log"

# Цветове
RED="\e[31m"
GREEN="\e[32m"
YELLOW="\e[33m"
CYAN="\e[36m"
RESET="\e[0m"

# Проверка за root
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}❌ Стартирай скрипта като root (sudo)!${RESET}"
    exit 1
fi

# Подобрена лог функция (с разделител за по-добра четимост)
log_message() {
    echo -e "$1"
    # Записваме в лога без цветови кодове (за чист текст)
    local clean_msg=$(echo -e "$2" | sed 's/\x1b\[[0-9;]*m//g')
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $clean_msg" >> "$LOG_FILE"
}

clear
echo -e "${CYAN}==========================================${RESET}"
echo -e "${CYAN}    SSD REPAIR TOOL - СИСТЕМА ЗА БЕКЪПИ    ${RESET}"
echo -e "${CYAN}==========================================${RESET}"
echo -e "Лог файл: ${YELLOW}$LOG_FILE${RESET}"
echo ""

# Потвърждение
echo -e "${YELLOW}ВНИМАНИЕ: Скриптът ще извърши fsck върху $DEVICE.${RESET}"
read -p "Сигурен ли си? (y/n): " confirm

if [[ $confirm != [yY] ]]; then
    echo -e "${RED}❌ Операцията е отменена.${RESET}"
    exit 0
fi

# Добавяме празен ред в лога за разделител между отделните пускания
echo "----------------------------------------------------------" >> "$LOG_FILE"
log_message "${CYAN}===> Старт на операция за $DEVICE${RESET}" "STARTING NEW SESSION"

# 1. Проверка mount point
if [ ! -d "$MOUNT_POINT" ]; then
    log_message "${RED}❌ Липсва mount point: $MOUNT_POINT${RESET}" "ERROR: Missing mount point directory"
    exit 1
fi

# 2. Проверка дали е монтиран и unmount
if mountpoint -q "$MOUNT_POINT"; then
    log_message "${YELLOW}⚠️ Дискът е монтиран.${RESET}" "Status: Mounted"

    # Показваме кои процеси пречат
    BUSY_PIDS=$(fuser -m "$MOUNT_POINT" 2>/dev/null)
    if [ -n "$BUSY_PIDS" ]; then
        echo -e "${CYAN}Процеси използващи диска (PIDs):${RESET} $BUSY_PIDS"
        read -p "Да бъдат ли спрени процесите автоматично? (y/n): " kill_confirm
        if [[ $kill_confirm == [yY] ]]; then
            log_message "${YELLOW}⚠️ Спиране на процеси...${RESET}" "Action: Killing processes $BUSY_PIDS"
            fuser -km "$MOUNT_POINT" 2>/dev/null
            sleep 2
        fi
    fi

    echo -e "${CYAN}Опит за unmount...${RESET}"
    umount -l "$MOUNT_POINT" # Добавено -l за по-сигурен unmount

    if mountpoint -q "$MOUNT_POINT"; then
        log_message "${RED}❌ Unmount неуспешен!${RESET}" "ERROR: Umount failed"
        exit 1
    else
        log_message "${GREEN}✅ Успешен unmount${RESET}" "Status: Unmount OK"
    fi
else
    log_message "${GREEN}✅ Вече е unmounted${RESET}" "Status: Already unmounted"
fi

# 3. fsck (Най-важната част)
log_message "${CYAN}===> Стартиране на fsck...${RESET}" "Action: Running fsck"
fsck -fvy "$DEVICE"
FSCK_RET=$?

if [ $FSCK_RET -lt 4 ]; then
    log_message "${GREEN}✅ fsck OK (код: $FSCK_RET)${RESET}" "Result: fsck Success"
else
    log_message "${RED}❌ fsck проблем (код: $FSCK_RET)${RESET}" "Result: fsck Critical Failure"
    exit 1
fi

# 4. mount обратно
log_message "${CYAN}===> Монтиране...${RESET}" "Action: Remounting"
mount "$DEVICE" "$MOUNT_POINT"

if [ $? -ne 0 ]; then
    log_message "${RED}❌ mount грешка${RESET}" "Result: Mount Failed"
    exit 1
else
    log_message "${GREEN}✅ mount OK${RESET}" "Result: Mount Success"
fi

# 5. Тест за запис
TEST_FILE="$MOUNT_POINT/repair_test_$(date +%s).tmp"
if touch "$TEST_FILE" 2>/dev/null; then
    rm "$TEST_FILE"
    log_message "${GREEN}✅ WRITE TEST OK${RESET}" "Write Test: PASSED"
else
    log_message "${RED}❌ WRITE TEST FAIL (Read-Only?)${RESET}" "Write Test: FAILED"
fi

# 6. SMART и Kernel logs (само на екрана, за да не пълним лог файла с излишно инфо)
echo -e "\n${CYAN}===> Последни kernel съобщения:${RESET}"
dmesg | tail -n 15

PARENT_DISK=$(lsblk -no PKNAME "$DEVICE")
if [ -n "$PARENT_DISK" ] && command -v smartctl >/dev/null 2>&1; then
    echo -e "\n${CYAN}===> SMART статус (/dev/$PARENT_DISK):${RESET}"
    smartctl -H "/dev/$PARENT_DISK" | grep -iE "result|status|health"
fi

log_message "${GREEN}===> ВСИЧКО ЗАВЪРШИ УСПЕШНО${RESET}" "SESSION FINISHED SUCCESSFULLY"