#!/usr/bin/env bash

set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PYTHON_BIN="${PYTHON_BIN:-}"
TARGET_TRIPLE="${TARGET_TRIPLE:-}"

if [[ -z "${PYTHON_BIN}" ]]; then
    if [[ -x "${ROOT_DIR}/python_sidecar/.venv/bin/python" ]]; then
        PYTHON_BIN="${ROOT_DIR}/python_sidecar/.venv/bin/python"
    elif command -v python3 >/dev/null 2>&1; then
        PYTHON_BIN="$(command -v python3)"
    elif command -v python >/dev/null 2>&1; then
        PYTHON_BIN="$(command -v python)"
    else
        echo "No python interpreter found (expected python3 or python)." >&2
        exit 1
    fi
fi

if [[ -z "${TARGET_TRIPLE}" ]]; then
    ARCH="$(uname -m)"
    OS="$(uname -s)"
    if [[ "${OS}" == "Darwin" && ("${ARCH}" == "arm64" || "${ARCH}" == "aarch64") ]]; then
        TARGET_TRIPLE="aarch64-apple-darwin"
    elif [[ "${OS}" == "Darwin" && "${ARCH}" == "x86_64" ]]; then
        TARGET_TRIPLE="x86_64-apple-darwin"
    elif [[ "${OS}" == "Linux" && "${ARCH}" == "x86_64" ]]; then
        TARGET_TRIPLE="x86_64-unknown-linux-gnu"
    elif [[ "${OS}" == "Linux" && ("${ARCH}" == "arm64" || "${ARCH}" == "aarch64") ]]; then
        TARGET_TRIPLE="aarch64-unknown-linux-gnu"
    else
        echo "Unsupported OS/arch for sidecar build: ${OS}/${ARCH}" >&2
        exit 1
    fi
fi

SIDECAR_NAME="showrunner-sidecar"
OUTPUT_DIR="${ROOT_DIR}/src-tauri/binaries"
SIDECAR_BUILD_ROOT="${ROOT_DIR}/.sidecar-build"
PYI_DIST_DIR="${SIDECAR_BUILD_ROOT}/dist"
PYI_BUILD_DIR="${SIDECAR_BUILD_ROOT}/build"
PYI_SPEC_DIR="${SIDECAR_BUILD_ROOT}/spec"
PYI_CONFIG_DIR="${SIDECAR_BUILD_ROOT}/pyinstaller-config"

echo "Building sidecar binary with ${PYTHON_BIN}"
echo "Target triple: ${TARGET_TRIPLE}"

mkdir -p "${OUTPUT_DIR}"
rm -rf "${SIDECAR_BUILD_ROOT}"
mkdir -p "${PYI_DIST_DIR}" "${PYI_BUILD_DIR}" "${PYI_SPEC_DIR}" "${PYI_CONFIG_DIR}"

if ! "${PYTHON_BIN}" -m pip show pyinstaller >/dev/null 2>&1; then
    "${PYTHON_BIN}" -m pip install pyinstaller >/dev/null
fi

# Validate required runtime deps are already present in the selected interpreter.
if ! "${PYTHON_BIN}" - <<'PY' >/dev/null 2>&1
import fastapi
import uvicorn
import pydantic
import ffmpeg  # provided by ffmpeg-python
PY
then
    echo "Missing sidecar dependencies in ${PYTHON_BIN}." >&2
    echo "Install them in that environment first, e.g.:" >&2
    echo "  cd ${ROOT_DIR}/python_sidecar && ${PYTHON_BIN} -m pip install -e '.[dev]'" >&2
    exit 1
fi

(
    cd "${ROOT_DIR}"
    export PYINSTALLER_CONFIG_DIR="${PYI_CONFIG_DIR}"
    "${PYTHON_BIN}" -m PyInstaller \
        --noconfirm \
        --clean \
        --onefile \
        --distpath "${PYI_DIST_DIR}" \
        --workpath "${PYI_BUILD_DIR}" \
        --specpath "${PYI_SPEC_DIR}" \
        --name "${SIDECAR_NAME}" \
        python_sidecar/main.py
)

if [[ ! -f "${PYI_DIST_DIR}/${SIDECAR_NAME}" ]]; then
    echo "PyInstaller output not found: ${PYI_DIST_DIR}/${SIDECAR_NAME}" >&2
    exit 1
fi

cp "${PYI_DIST_DIR}/${SIDECAR_NAME}" "${OUTPUT_DIR}/${SIDECAR_NAME}-${TARGET_TRIPLE}"
cp "${PYI_DIST_DIR}/${SIDECAR_NAME}" "${OUTPUT_DIR}/${SIDECAR_NAME}"
chmod +x "${OUTPUT_DIR}/${SIDECAR_NAME}-${TARGET_TRIPLE}" "${OUTPUT_DIR}/${SIDECAR_NAME}"

echo "Built sidecar binaries:"
echo "  ${OUTPUT_DIR}/${SIDECAR_NAME}-${TARGET_TRIPLE}"
echo "  ${OUTPUT_DIR}/${SIDECAR_NAME}"
