#!/usr/bin/env bash
# Initializes and validates the Tauri v2 audioplayer plugin.
# Usage: ./init.sh [--skip-dependencies] [--skip-checks]

set -euo pipefail

SKIP_DEPENDENCIES=false
SKIP_CHECKS=false

for argument in "$@"; do
  case "$argument" in
    --skip-dependencies) SKIP_DEPENDENCIES=true ;;
    --skip-checks) SKIP_CHECKS=true ;;
    *) echo "Unknown option: $argument" >&2; exit 2 ;;
  esac
done

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEMO_DIR="$ROOT_DIR/examples/demo"
EXIT_CODE=0

ok() { printf '\033[32m[OK]\033[0m %s\n' "$1"; }
warn() { printf '\033[33m[WARN]\033[0m %s\n' "$1"; }
fail() { printf '\033[31m[FAIL]\033[0m %s\n' "$1"; EXIT_CODE=1; }

require_command() {
  if command -v "$1" >/dev/null 2>&1; then
    ok "$1: $($1 --version | head -n 1)"
  else
    fail "$1 is not installed"
  fi
}

require_file() {
  if [[ -f "$ROOT_DIR/$1" ]]; then
    ok "$1"
  else
    fail "Missing $1"
  fi
}

run_check() {
  local label="$1"
  shift
  if "$@"; then
    ok "$label"
  else
    fail "$label"
  fi
}

printf '%s\n' '--- Toolchains ---'
require_command rustc
require_command cargo
require_command node
require_command pnpm

printf '\n%s\n' '--- Tauri plugin structure ---'
for path in \
  Cargo.toml Cargo.lock build.rs package.json rollup.config.js \
  src/lib.rs src/commands.rs src/desktop.rs src/mobile.rs src/error.rs src/models.rs \
  guest-js/index.ts permissions/default.toml \
  examples/demo/package.json examples/demo/src-tauri/Cargo.toml examples/demo/src-tauri/tauri.conf.json; do
  require_file "$path"
done

if [[ "$EXIT_CODE" -ne 0 ]]; then
  printf '\n'; fail 'Fix the missing prerequisites before continuing.'
  exit "$EXIT_CODE"
fi

if [[ "$SKIP_DEPENDENCIES" == false ]]; then
  printf '\n%s\n' '--- Installing JavaScript dependencies ---'
  run_check 'Plugin dependencies installed' pnpm --dir "$ROOT_DIR" install --frozen-lockfile
  run_check 'Demo dependencies installed' pnpm --dir "$DEMO_DIR" install --frozen-lockfile
else
  warn 'Skipping dependency installation'
fi

if [[ "$SKIP_CHECKS" == false ]]; then
  printf '\n%s\n' '--- Building and validating the plugin ---'
  run_check 'JavaScript bindings built' pnpm --dir "$ROOT_DIR" build
  if [[ -f "$ROOT_DIR/dist-js/index.js" && -f "$ROOT_DIR/dist-js/index.d.ts" ]]; then
    ok 'Generated JavaScript bindings are present'
  else
    fail 'Generated JavaScript bindings are missing after the build'
  fi
  run_check 'Rust formatting is valid' cargo fmt --manifest-path "$ROOT_DIR/Cargo.toml" --check
  run_check 'Rust plugin compiles' cargo check --manifest-path "$ROOT_DIR/Cargo.toml"
  run_check 'Rust tests pass' cargo test --manifest-path "$ROOT_DIR/Cargo.toml"
  run_check 'Demo frontend builds' pnpm --dir "$DEMO_DIR" build
else
  warn 'Skipping build and test checks'
fi

printf '\n%s\n' '--- Summary ---'
if [[ "$EXIT_CODE" -eq 0 ]]; then
  ok 'Tauri audioplayer plugin is ready.'
else
  fail 'Initialization completed with errors.'
fi

exit "$EXIT_CODE"
