#!/usr/bin/env bash

# WebP を使う BASIC をトランスパイルした場合だけ、basic_to_c.py が
# *_build_webp.* / *_libwebp* を生成する。ex はビルド成功後にそれらを
# 自動削除する。残したい場合は KEEP_WEBP_SUPPORT_FILES=1 を指定する。
# WebPアニメも現在は同じ *_libwebp* 側へ統合されている。

# 引数がなければ sample.bas を使う
if [ $# -eq 0 ]; then
    src="sample.bas"
else
    src="$1"
fi

script_dir="$(cd "$(dirname "$0")" && pwd)"

# macOSでは利用するSDKを明示する。特にHigh Sierraの開発環境で、
# SDKパスを自動判定できないことによる大量の警告を避ける。
# 呼び出し元がSDKROOTを指定済みの場合は、その設定を優先する。
if [ "$(uname -s 2>/dev/null)" = "Darwin" ] && [ -z "${SDKROOT:-}" ]; then
    if command -v xcrun >/dev/null 2>&1; then
        detected_sdkroot="$(xcrun --show-sdk-path 2>/dev/null)"
        if [ -n "$detected_sdkroot" ] && [ -d "$detected_sdkroot" ]; then
            export SDKROOT="$detected_sdkroot"
        fi
    fi
fi

# CC が指定されていればそれを使い、未指定なら利用可能なCコンパイラを
# clang、gcc、ccの順に探す。FreeBSD/macOSだけでなく、gccのみを入れた
# LinuxやRaspberry Pi OSでも同じexを使用できるようにする。
compiler="${CC:-}"
if [ -z "$compiler" ]; then
    for candidate in clang gcc cc; do
        if command -v "$candidate" >/dev/null 2>&1; then
            compiler="$candidate"
            break
        fi
    done
fi
if [ -z "$compiler" ]; then
    echo "C compiler was not found. Install clang or gcc, or set CC." >&2
    exit 127
fi

# ソースの絶対パスと出力先を決定
if [[ "$src" = /* ]]; then
    src_path="$src"
else
    src_path="$(pwd)/$src"
fi
src_dir="$(cd "$(dirname "$src_path")" && pwd)"
src_file="$(basename "$src_path")"
base_name="${src_file%.bas}"
base="$src_dir/$base_name"

# Cソース生成
python3 "$script_dir/basic_to_c.py" "$src_path" "$base.c"

# コンパイル
extra_sources=()
extra_cflags=()
generated_support=()
if [ -f "${base}_libwebp_sources.txt" ]; then
    manifest="${base}_libwebp_sources.txt"
    manifest_dir="$(dirname "$manifest")"
    runtime_dir="${base}_libwebp"
    while IFS= read -r rel; do
        [ -n "$rel" ] && extra_sources+=("${manifest_dir}/${rel}")
    done < "$manifest"
    extra_cflags+=("-I${runtime_dir}" "-I${runtime_dir}/src" "-I${runtime_dir}/sharpyuv")
    generated_support+=(
        "${base}_build_webp.bat"
        "${base}_build_webp.sh"
        "${base}_libwebp"
        "${base}_libwebp_README.txt"
        "${base}_libwebp_sources.txt"
    )
fi


link_flags=(-lm)
case "$(uname -s 2>/dev/null)" in
    Darwin)
        mac_ver="$(sw_vers -productVersion 2>/dev/null || true)"
        case "$mac_ver" in
            10.6.*)
                link_flags+=(-framework CoreFoundation -framework ApplicationServices)
                ;;
            *)
                link_flags+=(-framework CoreFoundation -framework CoreGraphics -framework CoreText -framework ImageIO -framework ApplicationServices)
                ;;
        esac
        ;;
esac

if "$compiler" "$base.c" "${extra_sources[@]}" "${extra_cflags[@]}" "${link_flags[@]}" -o "$base"; then
    :
else
    rc=$?
    echo "C compilation failed (exit status ${rc}). / Cコンパイルに失敗しました（終了ステータス: ${rc}）。" >&2
    exit "$rc"
fi

if [ "${KEEP_WEBP_SUPPORT_FILES:-0}" != "1" ] && [ ${#generated_support[@]} -gt 0 ]; then
    rm -rf "${generated_support[@]}"
    rmdir "$src_dir/lib/image_format" 2>/dev/null || true
    rmdir "$src_dir/lib" 2>/dev/null || true
fi

# 実行
#./"$base"

#python3 basic_to_c.py sample.bas sample.c
#clang sample.c -lm -o sample
#./sample
