#!/usr/bin/env bash
#
# update_freedv.sh
#
# FreeDV-GUI のソースを最新化し、Windows向けにクロスコンパイルして
# インストーラー(.exe)を生成するスクリプト。
#
# 毎回 build_windows を作り直すシンプルな仕組み。
# (差分ビルドは外部依存のビルドシステムとの相性が悪く不安定なため、
#  確実さを優先してフルビルドのみに統一している)
#
# 使い方:
#   ./update_freedv.sh
#
set -euo pipefail

# ========= 設定（環境に合わせて必要なら変更） =========
FREEDV_DIR="$HOME/freedv-gui"
BUILD_DIR="$FREEDV_DIR/build_windows"
OUTPUT_DIR="$HOME/freedv-builds"
TARGET_ARCH="x86_64"     # Windows側のターゲット (x86_64 / aarch64)
# ======================================================

log()  { echo -e "\033[1;32m[INFO]\033[0m $*"; }
warn() { echo -e "\033[1;33m[WARN]\033[0m $*"; }
err()  { echo -e "\033[1;31m[ERROR]\033[0m $*" >&2; }

trap 'err "エラーが発生しました。上のログを確認してください。"' ERR

# --- 1. llvm-mingw の bin を自動検出してPATHに追加 ---
LLVM_MINGW_DIR=$(find "$HOME" -maxdepth 1 -type d -name "llvm-mingw-*" | sort | tail -n1)
if [[ -z "$LLVM_MINGW_DIR" ]]; then
    err "llvm-mingw-* フォルダが $HOME 直下に見つかりません。先にダウンロード・展開してください。"
    exit 1
fi
export PATH="$LLVM_MINGW_DIR/bin:$PATH"
log "LLVM MinGW: $LLVM_MINGW_DIR"

if ! command -v "${TARGET_ARCH}-w64-mingw32-clang" >/dev/null 2>&1; then
    err "${TARGET_ARCH}-w64-mingw32-clang が見つかりません。PATH設定を確認してください。"
    exit 1
fi

# --- 2. ソースを最新化 ---
if [[ ! -d "$FREEDV_DIR" ]]; then
    err "$FREEDV_DIR が存在しません。先に git clone してください。"
    exit 1
fi

log "ソースを更新しています..."
cd "$FREEDV_DIR"

if ! git diff --quiet || ! git diff --cached --quiet; then
    warn "作業ツリーに未コミットの変更があります。stashするか確認してください。"
    warn "続行すると更新に失敗する可能性があります。"
fi

BEFORE_HASH=$(git rev-parse HEAD)
git fetch origin
git pull --ff-only
AFTER_HASH=$(git rev-parse HEAD)

if [[ "$BEFORE_HASH" == "$AFTER_HASH" ]]; then
    log "変更はありませんでした（すでに最新です）。"
else
    log "更新しました: ${BEFORE_HASH:0:7} -> ${AFTER_HASH:0:7}"
fi

# --- 3. build_windows を作り直す ---
log "build_windows を作り直します（毎回フルビルドします）..."
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"
cd "$BUILD_DIR"

# --- 4. CMake構成 ---
log "CMake を構成しています..."
cmake -DCMAKE_TOOLCHAIN_FILE="${PWD}/../cross-compile/freedv-mingw-llvm-${TARGET_ARCH}.cmake" \
      -DPython3_ROOT_DIR=/usr \
      ..

# --- 5. ビルド ---
log "ビルドを実行しています（コア数: $(nproc)）..."
make -j"$(nproc)"

# --- 6. インストーラー作成 ---
log "インストーラーを作成しています..."
make package

# --- 7. 生成物を分かりやすい場所にコピー ---
mkdir -p "$OUTPUT_DIR"
LATEST_EXE=$(find "$BUILD_DIR" -maxdepth 1 -name "FreeDV-*-windows-${TARGET_ARCH}.exe" -printf '%T@ %p\n' | sort -rn | head -n1 | cut -d' ' -f2-)

if [[ -z "$LATEST_EXE" ]]; then
    err "生成されたインストーラーが見つかりませんでした。"
    exit 1
fi

cp "$LATEST_EXE" "$OUTPUT_DIR/"
log "完了しました！"
log "インストーラー: $OUTPUT_DIR/$(basename "$LATEST_EXE")"

# WSL環境ならWindows側のパスも表示
if grep -qi microsoft /proc/version 2>/dev/null; then
    WIN_PATH=$(wslpath -w "$OUTPUT_DIR/$(basename "$LATEST_EXE")" 2>/dev/null || true)
    if [[ -n "$WIN_PATH" ]]; then
        log "Windowsからのパス: $WIN_PATH"
    fi
fi