#!/bin/sh
# AirWiFi ürün sürümü kontrolü — uzak URL öncelikli, yoksa yerel
# Manifest URL: uci airwifi.update.manifest_url

SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
if [ -f "$SCRIPT_DIR/lib/airwifi-auth.sh" ]; then
  . "$SCRIPT_DIR/lib/airwifi-auth.sh"
elif [ -f /usr/lib/airwifi/common.sh ]; then
  . /usr/lib/airwifi/common.sh
else
  . /www/cgi-bin/lib/airwifi-auth.sh 2>/dev/null || true
fi

require_auth

json_ok() {
  echo "Status: 200 OK"
  echo "Content-Type: application/json"
  echo "Cache-Control: no-store"
  echo
  echo "$1"
}

json_escape() {
  printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
}

if [ "${REQUEST_METHOD:-GET}" != "GET" ]; then
  echo "Status: 405 Method Not Allowed"
  echo "Content-Type: application/json"
  echo
  echo '{"ok":false,"error":"method_not_allowed"}'
  exit 1
fi

MODEL="$(ubus call system board 2>/dev/null | jsonfilter -e '@.model' 2>/dev/null)"
BOARD="$(ubus call system board 2>/dev/null | jsonfilter -e '@.board_name' 2>/dev/null)"
PRODUCT_MODEL="$(uci -q get airwifi.info.model 2>/dev/null)"
# Ürün sürümü (OpenWrt sürümü değil)
CURRENT="$(uci -q get airwifi.info.version 2>/dev/null)"
[ -z "$CURRENT" ] && CURRENT="$(uci -q get airwifi.info.firmware 2>/dev/null | sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p')"
[ -z "$CURRENT" ] && CURRENT="$(uci -q get airwifi.info.firmware 2>/dev/null | sed -n 's/.*[Vv ]\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/p')"
[ -z "$CURRENT" ] && CURRENT="1.0.0"
[ -z "$MODEL" ] && MODEL="${PRODUCT_MODEL:-unknown}"
[ -z "$BOARD" ] && BOARD="unknown"
[ -z "$PRODUCT_MODEL" ] && PRODUCT_MODEL="$MODEL"

TMP="/tmp/airwifi-manifest.json"
MANIFEST_LOADED=0

MANIFEST_URL="$(uci -q get airwifi.update.manifest_url 2>/dev/null)"
[ -z "$MANIFEST_URL" ] && MANIFEST_URL="${AIRWIFI_UPDATE_MANIFEST_URL:-}"

if [ -n "$MANIFEST_URL" ]; then
  if wget -q -T 20 -O "$TMP" "$MANIFEST_URL" 2>/dev/null || curl -fsSL -m 20 -o "$TMP" "$MANIFEST_URL" 2>/dev/null; then
    if [ -s "$TMP" ] && jsonfilter -i "$TMP" -e '@.latest' >/dev/null 2>&1; then
      MANIFEST_LOADED=1
    fi
  fi
fi

if [ "$MANIFEST_LOADED" -eq 0 ]; then
  for _mf in /etc/airwifi/update-manifest.json /www/ivorta/update-manifest.json; do
    if [ -f "$_mf" ]; then
      cp -f "$_mf" "$TMP" 2>/dev/null && MANIFEST_LOADED=1 && break
    fi
  done
fi

if [ "$MANIFEST_LOADED" -eq 0 ]; then
  CUR_ESC="$(json_escape "$CURRENT")"
  json_ok "{\"ok\":true,\"update_available\":false,\"current_version\":\"$CUR_ESC\",\"reason\":\"no_manifest\"}"
  exit 0
fi

LATEST="$(jsonfilter -i "$TMP" -e '@.latest' 2>/dev/null)"
VERSION_NAME="$(jsonfilter -i "$TMP" -e '@.version_name' 2>/dev/null)"
DOWNLOAD_URL="$(jsonfilter -i "$TMP" -e '@.download_url' 2>/dev/null)"
SHA256="$(jsonfilter -i "$TMP" -e '@.sha256' 2>/dev/null)"
CRITICAL="$(jsonfilter -i "$TMP" -e '@.critical' 2>/dev/null)"
[ -z "$CRITICAL" ] && CRITICAL="false"
[ -z "$VERSION_NAME" ] && VERSION_NAME="ivorta OS v${LATEST}"

MATCH=0
MODELS_FILE="/tmp/airwifi-models.list"
jsonfilter -i "$TMP" -e '@.models[*]' 2>/dev/null > "$MODELS_FILE"
while read -r entry; do
  [ -z "$entry" ] && continue
  if [ "$entry" = "*" ]; then
    MATCH=1
    break
  fi
  case "$MODEL $BOARD $PRODUCT_MODEL" in
    *"$entry"*) MATCH=1; break ;;
  esac
done < "$MODELS_FILE"
rm -f "$MODELS_FILE"

CUR_ESC="$(json_escape "$CURRENT")"

if [ "$MATCH" -eq 0 ]; then
  json_ok "{\"ok\":true,\"update_available\":false,\"current_version\":\"$CUR_ESC\",\"reason\":\"model_not_supported\"}"
  exit 0
fi

if [ -z "$LATEST" ]; then
  json_ok "{\"ok\":true,\"update_available\":false,\"current_version\":\"$CUR_ESC\",\"reason\":\"invalid_manifest\"}"
  exit 0
fi

NEWER=0
if [ "$CURRENT" != "$LATEST" ]; then
  if [ "$(printf '%s\n%s\n' "$CURRENT" "$LATEST" | sort -V | tail -n1)" = "$LATEST" ]; then
    NEWER=1
  fi
fi

LAT_ESC="$(json_escape "$LATEST")"
NAME_ESC="$(json_escape "$VERSION_NAME")"

if [ "$NEWER" -eq 0 ]; then
  json_ok "{\"ok\":true,\"update_available\":false,\"current_version\":\"$CUR_ESC\",\"latest_version\":\"$LAT_ESC\",\"latest_version_name\":\"$NAME_ESC\"}"
  exit 0
fi

build_list() {
  _path="$1"
  _out=""
  _idx=0
  while _item="$(jsonfilter -i "$TMP" -e "${_path}[$_idx]" 2>/dev/null)"; do
    [ -n "$_out" ] && _out="$_out,"
    _out="$_out\"$(json_escape "$_item")\""
    _idx=$((_idx + 1))
  done
  printf '%s' "$_out"
}

build_lang_block() {
  _lang="$1"
  _warn="$(jsonfilter -i "$TMP" -e "@.changelog.${_lang}.warning" 2>/dev/null)"
  _over="$(jsonfilter -i "$TMP" -e "@.changelog.${_lang}.overview" 2>/dev/null)"
  _feat="$(build_list "@.changelog.${_lang}.features")"
  _opt="$(build_list "@.changelog.${_lang}.optimizations")"
  if [ -z "$_warn" ] && [ -z "$_over" ] && [ -z "$_feat" ] && [ -z "$_opt" ]; then
    return 1
  fi
  printf '"%s":{"warning":"%s","overview":"%s","features":[%s],"optimizations":[%s]}' \
    "$_lang" "$(json_escape "$_warn")" "$(json_escape "$_over")" "$_feat" "$_opt"
}

CHANGELOG_JSON=""
for _lang in en tr de fr es it ru zh ja ko ar; do
  _block="$(build_lang_block "$_lang")" || continue
  [ -n "$CHANGELOG_JSON" ] && CHANGELOG_JSON="${CHANGELOG_JSON},"
  CHANGELOG_JSON="${CHANGELOG_JSON}${_block}"
done

DL_ESC="$(json_escape "$DOWNLOAD_URL")"
SHA_ESC="$(json_escape "$SHA256")"

json_ok "{\"ok\":true,\"update_available\":true,\"current_version\":\"$CUR_ESC\",\"latest_version\":\"$LAT_ESC\",\"latest_version_name\":\"$NAME_ESC\",\"download_url\":\"$DL_ESC\",\"sha256\":\"$SHA_ESC\",\"critical\":$CRITICAL,\"changelog\":{${CHANGELOG_JSON}}}"
