#!/bin/sh
set -eu

ROOT="${MDESK_APP_ROOT:?MDESK_APP_ROOT is not set}"
DATA="${MDESK_DATA_DIR:?MDESK_DATA_DIR is not set}"
VAR="${MDESK_VAR_DIR:-$DATA}"
SOCKET="${MDESK_SOCKET:?MDESK_SOCKET is not set}"
BASE="${MDESK_BASE_PATH:?MDESK_BASE_PATH is not set}"

case "$(uname -m)" in
  x86_64|amd64)
    BIN="$ROOT/bin/taosync-amd64"
    PROXY="$ROOT/bin/proxy-amd64"
    ;;
  aarch64|arm64)
    BIN="$ROOT/bin/taosync-arm64"
    PROXY="$ROOT/bin/proxy-arm64"
    ;;
  *)
    echo "TaoSync: unsupported architecture: $(uname -m)" >&2
    exit 1
    ;;
esac

umask 077
mkdir -p "$DATA/data" "$VAR/tmp"

can_exec() {
  dir="$1"
  mkdir -p "$dir" 2>/dev/null || return 1
  probe="$dir/.exec-test.$$"
  printf '#!/bin/sh\nexit 0\n' > "$probe" 2>/dev/null || return 1
  chmod +x "$probe" 2>/dev/null || { rm -f "$probe"; return 1; }
  "$probe" 2>/dev/null || { rm -f "$probe"; return 1; }
  rm -f "$probe"
  return 0
}

# StaticX and PyInstaller extract into TMPDIR, so it must be writable and
# executable. Fall back to /tmp when the app var dir is mounted noexec.
TMPBASE="$VAR/tmp"
if ! can_exec "$TMPBASE"; then
  TMPBASE="${TMPDIR:-/tmp}"
fi

# mpkpack only marks native.executable as 0755. Use the packaged binaries
# directly when possible, otherwise copy them to an executable location.
BINDIR="$VAR/bin"
if ! can_exec "$BINDIR"; then
  BINDIR="$TMPBASE/taosync-bin-$$"
fi

prepare_exec() {
  src="$1"
  if [ -x "$src" ]; then
    printf '%s\n' "$src"
    return 0
  fi
  if chmod +x "$src" 2>/dev/null && [ -x "$src" ]; then
    printf '%s\n' "$src"
    return 0
  fi
  mkdir -p "$BINDIR"
  dst="$BINDIR/$(basename "$src")-${MDESK_APP_VERSION:-0}"
  cp -f "$src" "$dst"
  chmod +x "$dst"
  printf '%s\n' "$dst"
}

BIN="$(prepare_exec "$BIN")"
PROXY="$(prepare_exec "$PROXY")"

# TaoSync writes to a relative ./data directory, so run from the app data dir.
cd "$DATA"

# First run: generate an initial admin password unless the user supplied one.
if [ ! -f "data/taoSync.db" ] && [ -z "${TAO_PASSWORD:-}" ]; then
  PASS="$(tr -dc 'A-Za-z0-9' </dev/urandom | head -c 16)"
  [ -n "$PASS" ] || PASS="taosync-$(date +%s)"
  export TAO_PASSWORD="$PASS"
  cat > "data/首次登录密码.txt" <<EOF
TaoSync 首次登录信息
用户名: admin
密码: $PASS
登录后请立即在「系统设置」中修改密码。
EOF
fi

export TAO_LOG_LEVEL="${TAO_LOG_LEVEL:-1}"
export TAO_CONSOLE_LEVEL="${TAO_CONSOLE_LEVEL:-2}"
export TZ="${TZ:-Asia/Shanghai}"
export HOME="$DATA"
export TMPDIR="$TMPBASE"

exec "$PROXY" \
  -socket "$SOCKET" \
  -base "$BASE" \
  -web "$ROOT/web" \
  -app "$BIN" \
  -data "$DATA"
