#!/bin/bash

script_directory="$(dirname "$0")"
game_root="$(cd "$script_directory" && pwd)"
database_file="$script_directory/sj.a"

# Переименуем файл существующей базы данных с timestamp
if [ -f "$database_file" ]; then
  timestamp=$(date +"%Y-%m-%d-%H-%M-%S")
  backup_file="$script_directory/sj.a-$timestamp"
  mv "$database_file" "$backup_file"
  echo "Создан бэкап: $backup_file"
fi

# Создаем таблицы в базе данных
{
  echo "BEGIN;"
  echo "CREATE TABLE tbl_game (
    gameid INTEGER PRIMARY KEY,
    game TEXT,
    suffix TEXT,
    zh_id INTEGER,
    en_id INTEGER,
    ko_id INTEGER,
    tw_id INTEGER,
    video_id INTEGER,
    class_type INTEGER,
    game_type INTEGER,
    hard INTEGER,
    timer TEXT
  );"
  echo "CREATE TABLE tbl_en (
    en_id INTEGER PRIMARY KEY,
    en_title TEXT
  );"
  echo "CREATE TABLE tbl_ko (
    ko_id INTEGER PRIMARY KEY,
    ko_title TEXT
  );"
  echo "CREATE TABLE tbl_zh (
    zh_id INTEGER PRIMARY KEY,
    zh_title TEXT
  );"
  echo "CREATE TABLE tbl_tw (
    tw_id INTEGER PRIMARY KEY,
    tw_title TEXT
  );"
  echo "CREATE TABLE tbl_match (
    ID INTEGER PRIMARY KEY,
    zh_match TEXT
  );"
  echo "CREATE TABLE tbl_path (
    path_id INTEGER PRIMARY KEY,
    path TEXT
  );"
  echo "CREATE TABLE tbl_video (
    video_id INTEGER,
    video TEXT,
    path_id INTEGER
  );"
  echo "CREATE TABLE tbl_total (
    ID INTEGER,
    total INTEGER,
    PRIMARY KEY(ID)
  );"
  echo "CREATE TABLE files (
    path TEXT,
    file_name TEXT,
    extension TEXT,
    class_type INTEGER,
    game_type INTEGER
  );"
  echo "COMMIT;"
} | sqlite3 "$database_file"

:<<COMMENT
В общем, тут идут строки для поиска ромов по папкам и т.п.
Они выглядит так: "class_type,game_type,core,extensions,path", который разделен запятой, где:
1. class_type - номер приставки в minigui (не помню как меню называется, там где 9 приставок на выбор, а после нажатия пишет "Class reading")
2. game_type - номер ядра из start_game.sh, которое используется для запуска.
3. core - название ядра, которое используется из start_game.sh (оно в целом ни на что не влияет в дальнейшем скрипте, просто для себя сделал)
4. extensions - расширения, которые "кушает" ядро. Можно брать отсюда "https://github.com/libretro/libretro-super/tree/master/dist/info" -
   из строчки "supported_extensions", просто копируя.
5. path - путь к папке с играми той или иной приставки.
COMMENT

# Формируем массив из таблицы
#"class_type,game_type,core,extensions,path"

game_data=(
  [0]="0,0,fbalpha2012_libretro,iso|zip|7z,cps/fbalpha2012"
  [1]="1,1,nestopia_libretro,nes|fds|unf|unif,fc"
  [2]="5,5,genesisplusgx_libretro,mdx|md|smd|gen|bin|iso|sms|bms|gg|sg|68k|sgd|chd|m3u,md"
  [3]="6,6,snes9x_libretro,smc|sfc|swc|fig|bs|st,sfc"
  [4]="2,7,mgba_libretro,gb,gb"
  [5]="3,7,mgba_libretro,gba,gba"
  [6]="4,7,mgba_libretro,gbc,gbc"
  [7]="9,8,mupen64plus_libretro,n64|v64|z64|ndd|bin|u1,n64"
  [8]="4,9,pcsx_rearmed_libretro_default_v5,bin|img|mdf|pbp|toc|cbn|m3u|chd,ps1"
  [9]="12,10,mednafen_pce_fast_libretro,pce|chd|toc|m3u,pcengine"
  [10]="11,12,desmume2015_libretro,nds|ids|bin,ds"
  [11]="0,18,mame2016_libretro,zip|chd|7z|cmd,cps/mame2016"
  [12]="7,15,stella_libretro_other,a26|bin,atari"
  [13]="7,16,atari800_libretro_other,xfd|atr|cdm|cas|bin|a52|zip|atx|car|rom|com|xex,atari/atari800"
  [14]="7,17,prosystem_libretro_other,a78|bin,atari/atari7800"
  [15]="8,27,fuse_libretro,tzx|tap|z80|rzx|scl|trd|dsk|zip,spec"
  [16]="5,29,picodrive_libretro.so,bin|gen|smd|md|32x|iso|chd|sms|gg|sg|sc|m3u|68k|sgd|pco,md/Sega32X"
  [17]="10,31,yabause_libretro,bin|chd|iso|mds|zip|m3u,saturn"
  [18]="13,33,flycast_libretro,chd|cdi|elf|bin|gdi|lst|zip|dat|7z|m3u,dreamcast"
  [19]="14,34,scummvm_libretro,scummvm,scummvm"
  [20]="15,35,dosbox_svn_libretro,exe|com|bat|conf|iso|dos,dos"
  [21]="0,37,fbneo_libretro,zip|7z,fbneo"
  [22]="17,38,squirreljme_libretro,jar|sqc|jam|jad|kjx,j2me"
  [23]="19,39,4do_libretro,iso|bin|chd,3do"
  [24]="18,15,scripts,gsts,scripts"
)

# Формируем пакетную вставку
insert_query="BEGIN TRANSACTION;"

for ((i=0; i<${#game_data[@]}; i++)); do
  item="${game_data[i]}"
  IFS=',' read -r class_type game_type core extensions rel_path <<< "$item"

  # Полный путь к директории
  full_path="$game_root/$rel_path"
  
  # Проверяем существование директории
  if [ ! -d "$full_path" ]; then
    echo "Пропускаем несуществующую директорию: $rel_path"
    continue
  fi

  echo "Обрабатываем: $rel_path (class_type=$class_type, game_type=$game_type)"

  # Разделяем строку extensions с помощью разделителя '|'
  IFS='|' read -ra ext_array <<< "$extensions"

  # Формируем аргументы для команды find
  find_args=("-type" "f" "(")
  for ext in "${ext_array[@]}"; do
    find_args+=("-iname" "*.$ext" "-o")
  done
  find_args=("${find_args[@]::${#find_args[@]}-1}" ")")

  # Выполняем команду find и формируем значения для пакетной вставки
  while IFS= read -r -d '' file; do
    file_name="$(basename "$file")"
    
    # Проверка, является ли файл скрытым системным файлом
    if [[ "$file_name" == .* ]]; then
      continue  
    fi
    
    file_extension="${file_name##*.}"
    file_name_without_extension="${file_name%.*}"
    file_name_without_extension="${file_name_without_extension//\'/''}"
	
    # Преобразуем расширение файла в нижний регистр и добавляем точку в начале
    file_extension_lowercase=".$(echo "${file_extension}" | tr '[:upper:]' '[:lower:]')"
	
    # Определяем базовую директорию для timer (первый уровень после game_root)
    base_dir=$(echo "$rel_path" | cut -d'/' -f1)
    timer_path="/sdcard/game/$base_dir"

    # Формируем значения для пакетной вставки
    insert_query+="INSERT INTO files VALUES ('$timer_path', '$file_name_without_extension', '$file_extension_lowercase', $class_type, $game_type);"

  done < <(find "$full_path" "${find_args[@]}" -print0 2>/dev/null)
done

# Завершаем пакетную вставку
insert_query+="COMMIT;"
echo "$insert_query" | sqlite3 "$database_file"

# Обновление значений и создание основных таблиц
echo "

BEGIN;
-- Вставка записей в таблицу tbl_game
INSERT INTO tbl_game (gameid, game, suffix, zh_id, en_id, ko_id, tw_id, video_id, class_type, game_type, hard, timer)
SELECT 
  row_number() OVER (ORDER BY file_name COLLATE NOCASE), 
  file_name, 
  extension, 
  row_number() OVER (ORDER BY file_name COLLATE NOCASE), 
  row_number() OVER (ORDER BY file_name COLLATE NOCASE), 
  row_number() OVER (ORDER BY file_name COLLATE NOCASE), 
  row_number() OVER (ORDER BY file_name COLLATE NOCASE), 
  row_number() OVER (ORDER BY file_name COLLATE NOCASE), 
  class_type, 
  game_type, 
  0, 
  path
FROM files
ORDER BY file_name COLLATE NOCASE;

-- Вставка записей в другие языковые таблицы
INSERT INTO tbl_en SELECT en_id, REPLACE(game, ' ', '_') FROM tbl_game;
INSERT INTO tbl_ko SELECT ko_id, REPLACE(game, ' ', '_') FROM tbl_game;
INSERT INTO tbl_tw SELECT tw_id, REPLACE(game, ' ', '_') FROM tbl_game;
INSERT INTO tbl_zh SELECT zh_id, REPLACE(game, ' ', '_') FROM tbl_game;

-- Вставка записей в таблицу tbl_match
INSERT INTO tbl_match SELECT gameid, REPLACE(game, ' ', '') FROM tbl_game;

-- Вставка записей в таблицу tbl_path
INSERT INTO tbl_path (path_id, path) VALUES (1, '/sdcard/game');

-- Вставка записей в таблицу tbl_total
INSERT INTO tbl_total (ID, total)
SELECT gameid, gameid
FROM tbl_game
ORDER BY gameid DESC
LIMIT 1;

-- Вставка записей в таблицу tbl_video
INSERT INTO tbl_video (video_id, video, path_id)
SELECT gameid, NULL, 1
FROM tbl_game
WHERE video_id = gameid;

COMMIT;
" | sqlite3 "$database_file"

echo "Выполнено успешно."
echo "Всего игр в базе: $(sqlite3 "$database_file" "SELECT COUNT(*) FROM tbl_game;")"
exit 0
