#!/bin/bash

DISK=$(isoinfo -d -i /dev/sr0 | grep "Volume id" | cut -c 12- ) 

# Проверяем, не пустая ли переменная
if [ -z "$DISK" ]; then
    echo "Ошибка: Диск в /dev/sr0 не найден или не читается."
    exit 1
fi

FILE_NAME="/home/brusee/Документы/0/files_tree_$DISK.json"
TMP_FILE="/home/brusee/Документы/0/.files_tree_tmp_md5_$DISK.json"

cd /media/cdrom0 || exit 1

if [ -f "$FILE_NAME" ]; then
 
    # Сохраняем точное время доступа (atime) и изменения (mtime) оригинала
    # Используем формат %x и %y для максимальной точности
    ATIME=$(stat -c "%x" "$FILE_NAME")
    MTIME=$(stat -c "%y" "$FILE_NAME")

    # Копируем файл с сохранением атрибутов (-p сохранит mtime у .old)
    cp -p "$FILE_NAME" "$FILE_NAME.old" 
else
    tree -axNsDfJo $FILE_NAME --inodes
    jq  --arg DISK "$DISK"  '.[0]["name"] = $DISK' "$FILE_NAME" > /tmp/files_tree_tmp.$DISK && mv /tmp/files_tree_tmp.$DISK "$FILE_NAME"
fi

# Извлекаем все пути "name" из объектов, где "type": "file" (рекурсивно по всему дереву)
FILE_PATHS=$(jq -r '.. | objects | select(.type == "file") | .name' "$FILE_NAME")

# Копируем файл для работы
cp "$FILE_NAME" "$TMP_FILE"

# Проходим циклом по найденным путям
for filepath in $FILE_PATHS; do
    if [ -f "$filepath" ]; then
        CURRENT_MD5=$(md5sum "$filepath" | awk '{print $1}')
        
        # Извлекаем существующий MD5 для этого конкретного пути (первый найденный)
        EXISTING_MD5=$(jq -r --arg name "$filepath" '.. | objects | select(.type == "file" and .name == $name) | .md5 // empty' "$FILE_NAME" | head -n 1)
        if [ -n "$EXISTING_MD5" ] && [ "$EXISTING_MD5" != "null" ]; then
            if [ "$CURRENT_MD5" = "$EXISTING_MD5" ]; then
                echo "OK: $filepath"
            else
                echo "CHANGED: $filepath (был $EXISTING_MD5, стал $CURRENT_MD5)"
            fi
        else
            echo "NEW/EMPTY: $filepath (хеш $CURRENT_MD5)"
        fi

        # Обновляем значение md5 рекурсивно по всему дереву
        # walk(if type == "object" ...) проходит через каждый объект в JSON
        jq --arg name "$filepath" --arg md5 "$CURRENT_MD5" \
          'walk(if type == "object" and .type == "file" and .name == $name then .md5 = $md5 else . end)' \
          "$TMP_FILE" > "${TMP_FILE}.new" && mv "${TMP_FILE}.new" "$TMP_FILE"
    fi
done

# Проверяем, есть ли отличия между файлами
if cmp -s "$FILE_NAME" "$TMP_FILE"; then
    echo "Изменений не обнаружено."
    rm "$TMP_FILE"
else
    echo -e "\nОБНАРУЖЕНЫ ИЗМЕНЕНИЯ!"
    echo "1) Перезаписать исходный файл ($FILE_NAME)"
    echo "2) Сохранить как новый файл (по умолчанию ${FILE_NAME%.json}_new.json)"
    echo "3) Отмена"
    read -p "Выберите вариант (1-3): " choice

    case $choice in
        1)
            mv "$TMP_FILE" "$FILE_NAME"
            echo "Файл обновлен."
            exit 0
            ;;
        2)                
             # Формируем имя по умолчанию
             DEFAULT_NAME="${FILE_NAME%.json}_new.json"
             # Флаг -e включает readline, а -i подставляет текст прямо в строку ввода
             read -e -p "Имя нового файла: " -i "$DEFAULT_NAME" NEW_NAME
             mv "$TMP_FILE" "$NEW_NAME"
             echo "Сохранено в файл: $NEW_NAME"
            ;;
        3)
            echo "Отменено. Временный файл удален."
            rm "$TMP_FILE"
            ;;
        *)
            echo "Неверный выбор. Временный файл удален. Выход."
            rm "$TMP_FILE"
            ;;
    esac
fi


if [ -f "$FILE_NAME.old" ]; then
    # Принудительно возвращаем время ДОСТУПА и ИЗМЕНЕНИЯ оригиналу
    # (так как чтение обновило его atime)
    touch -a -d "$ATIME" "$FILE_NAME"
    touch -m -d "$MTIME" "$FILE_NAME"
fi

if [ -f "$FILE_NAME.old" ]; then
    echo -e "\nСоздана копия старого файла: $FILE_NAME.old"
    read -p "Удалить ее? (y/n) [по умолчанию: y]: " rm_choice
    rm_choice=${rm_choice:-y}
    if [[ "$rm_choice" =~ ^[YyДд]$ ]]; then
        rm "$FILE_NAME.old"
        echo "файл $FILE_NAME.old удален."
    else
        echo "файл $FILE_NAME.old сохранен"
    fi
fi
