#!/usr/bin/env bash

set -euo pipefail
shopt -s nullglob   # 若沒有符合的檔案，不要把 pattern 當字串丟進去

# 可在外面用 PGUSER/PGHOST/PGPORT/PGPASSWORD 覆寫
PGUSER="postgres"
PGHOST="127.0.0.1"
PGPORT="5432"

# 檢查必要指令是否存在
if ! command -v psql >/dev/null 2>&1; then
    echo "錯誤：找不到 psql 指令，請確認 PostgreSQL client 已安裝並在 PATH 中。"
    exit 1
fi

if ! command -v pg_restore >/dev/null 2>&1; then
    echo "錯誤：找不到 pg_restore 指令，請確認 PostgreSQL client 已安裝並在 PATH 中。"
    exit 1
fi

# 收集 .sql 檔案
sql_files=( *.sql )

if [ "${#sql_files[@]}" -eq 0 ]; then
    echo "目前目錄下沒有任何 .sql 檔案，結束。"
    exit 0
fi

echo "即將處理以下檔案："
printf '  %s\n' "${sql_files[@]}"
echo

for file in "${sql_files[@]}"; do
    # 取檔名前半段 (以第一個 - 為界)，和原本 awk -F"-" '{print $1}' 行為一致
    dbname="${file%%-*}"

    if [[ -z "$dbname" ]]; then
        echo "警告：檔案 '$file' 無法解析出 dbname（在第一個 '-' 之前），略過。"
        continue
    fi

    echo "處理檔案：$file => 資料庫名稱：$dbname"

    # 檢查 DB 是否已存在
    db_exists=$(psql -U "$PGUSER" -h "$PGHOST" -p "$PGPORT" -tAc \
        "SELECT 1 FROM pg_database WHERE datname = '$dbname'" || true)

    if [[ "$db_exists" == "1" ]]; then
        echo "  資料庫 '$dbname' 已存在，略過建立與還原。"
        echo
        continue
    fi

    # 建立資料庫
    echo "  建立資料庫 '$dbname' ..."
    psql -U "$PGUSER" -h "$PGHOST" -p "$PGPORT" -v ON_ERROR_STOP=1 -c \
        "CREATE DATABASE \"$dbname\" ENCODING='SQL_ASCII' TEMPLATE=TEMPLATE0;"

    # 還原資料庫
    echo "  還原資料庫 '$dbname' 中 (來源檔案: $file) ..."
    if ! pg_restore -U "$PGUSER" -h "$PGHOST" -p "$PGPORT" -d "$dbname" < "$file"; then
        echo "  錯誤：還原 '$file' 到資料庫 '$dbname' 失敗，將刪除該資料庫以避免殘留不完整狀態。"
        psql -U "$PGUSER" -h "$PGHOST" -p "$PGPORT" -v ON_ERROR_STOP=1 -c \
            "DROP DATABASE IF EXISTS \"$dbname\";"
        exit 1
    fi

    echo "  完成：$file => $dbname"
    echo
done

echo "全部處理完成。"

