#!/bin/bash

if [ -z "$1" ]; then
    echo "Использование: $0 /путь/к/папке/DELTARUNE/"
    exit 1
fi

GAME_PATH="$1"

if [ ! -d "$GAME_PATH" ]; then
    echo "Ошибка: указанная папка не существует!"
    exit 1
fi

if [ ! -f "$GAME_PATH/data.win" ]; then
    echo "Ошибка: файл data.win не найден!"
    exit 1
fi

if [ ! -f "$GAME_PATH/chapter3_windows/data.win" ]; then
    echo "Ошибка: файл chapter3_windows/data.win не найден!"
    exit 1
fi

if [ ! -f "$GAME_PATH/chapter4_windows/data.win" ]; then
    echo "Ошибка: файл chapter4_windows/data.win не найден!"
    exit 1
fi

# Определение архитектуры и выбор патчера
ARCH="$(uname -m)"
case "$ARCH" in
    x86_64)
        PATCHER_BIN="data/bin/GMS-UTML-Patcher"
        ;;
    aarch64)
        PATCHER_BIN="data/bin-arm64/GMS-UTML-Patcher"
        ;;
    *)
        echo "Ошибка: архитектура $ARCH не поддерживается!"
        exit 1
        ;;
esac

# Проверка наличия бинарника
if [ ! -f "$PATCHER_BIN" ]; then
    echo "Ошибка: бинарник патчера $PATCHER_BIN не найден!"
    exit 1
fi

# Делаем бинарник исполняемым
chmod +x "$PATCHER_BIN"

# Таблица файлов и патчей
declare -A PATCHES
PATCHES["data.win"]="data/patch/ch_sel/data.win.json"
PATCHES["chapter3_windows/data.win"]="data/patch/ch3/data.win.json"
PATCHES["chapter4_windows/data.win"]="data/patch/ch4/data.win.json"

# Функция запуска патчинга с обработкой ошибок
run_patcher() {
    local fileindir="$1"
    local patchfile="$2"
    local extra_args="$3"

    local outfile="$GAME_PATH/$fileindir.patched"

    "$PATCHER_BIN" \
        --data-path "$GAME_PATH/$fileindir" \
        --patcher-file "$patchfile" \
        --output "$outfile" \
        $extra_args
    local exit_code=$?

    if [ $exit_code -eq 204 ] || [ $exit_code -eq 205 ] || [ $exit_code -eq 206 ]; then
        case $exit_code in
            204) msg="Обнаружена модификация! Возможно, перевод уже установлен." ;;
            205) msg="Версия перевода неактуальна! Игра может не работать." ;;
            206) msg="Ваша версия игры устарела! Игра может не работать." ;;
        esac
        echo "$msg"
        read -p "Продолжить патчинг? (y/n): " choice
        if [[ "$choice" =~ ^[Yy]$ ]]; then
            run_patcher "$fileindir" "$patchfile" "--skip-timecheck"
            return
        else
            echo "Установка отменена пользователем."
            exit 1
        fi
    elif [ $exit_code -ne 0 ]; then
        echo "Ошибка патчинга! Код выхода: $exit_code"
        exit $exit_code
    fi

    # Если патч успешен — заменяем оригинальный data.win
    if [ -f "$outfile" ]; then
        mv -f "$outfile" "$GAME_PATH/$fileindir"
        echo "Файл $fileindir успешно обновлён."
    else
        echo "Ошибка: выходной файл $outfile не найден!"
        exit 1
    fi
}

for fileindir in "${!PATCHES[@]}"; do
    patchfile="${PATCHES[$fileindir]}"
    echo "Патчим $fileindir с патчем $patchfile..."
    run_patcher "$fileindir" "$patchfile"
done

# Копирование дополнительных файлов
echo "Копирование файлов..."
cp -r data/patch/copy/chapter3/* "$GAME_PATH/chapter3_windows/"
cp -r data/patch/copy/chapter4/* "$GAME_PATH/chapter4_windows/"

echo "Патчинг завершён!"
