#!/usr/bin/env bash
# onx-db-versions-available — Repo'lardan canlı MariaDB/MySQL versiyon listesi.
#
# CentOS/RHEL: dnf module list + MariaDB upstream API
# Debian/Ubuntu: apt-cache search + MariaDB upstream API
#
# Cache: /var/cache/onoxsoft/db-versions.json (24h TTL)
# Override: --force flag ile yeniden çek
#
# Input (stdin JSON):
#   force          bool   (optional) Cache'i bypass et
#
# Output (stdout JSON):
#   {
#     "fetched_at": "2026-05-16T15:30:00Z",
#     "source": "live" | "cache",
#     "targets": [
#       {"engine":"mariadb","version":"10.6","label":"MariaDB 10.6 (LTS)","note":"...","eol":"2026-07"},
#       ...
#     ]
#   }
#
# Exit codes: 0=ok 2=preflight-fail 3=exec-fail

set -euo pipefail

SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
source "${SCRIPT_DIR}/_lib/common.sh"

CACHE_DIR="/var/cache/onoxsoft"
CACHE_FILE="${CACHE_DIR}/db-versions.json"
CACHE_TTL_HOURS=24

INPUT=$(cat 2>/dev/null || echo '{}')
FORCE=$(onx_json_get_bool "${INPUT}" "force" "false" 2>/dev/null || echo "false")

# ── Cache check ──────────────────────────────────────────────────────────────
mkdir -p "${CACHE_DIR}"

if [[ "${FORCE}" != "true" && -f "${CACHE_FILE}" ]]; then
    AGE_HOURS=$(( ( $(date +%s) - $(stat -c %Y "${CACHE_FILE}") ) / 3600 ))
    if [[ ${AGE_HOURS} -lt ${CACHE_TTL_HOURS} ]]; then
        cat "${CACHE_FILE}"
        exit 0
    fi
fi

# ── Build static metadata (LTS/EOL bilgileri) ────────────────────────────────
# MariaDB ve MySQL'in resmi LTS politikası — yıllık güncellenmeli
# Kaynak: mariadb.com/kb/en/mariadb-server-release-dates/, dev.mysql.com/doc/refman/8.0/en/
declare -A KNOWN_VERSIONS=(
    # MariaDB
    ["mariadb:10.6"]="MariaDB 10.6 (LTS)|EOL Tem 2026 — kısa vadeli|2026-07"
    ["mariadb:10.11"]="MariaDB 10.11 (LTS)|EOL Şub 2028 — orta vadeli|2028-02"
    ["mariadb:11.4"]="MariaDB 11.4 (LTS)|EOL May 2029 — uzun vadeli|2029-05"
    ["mariadb:11.8"]="MariaDB 11.8 (current)|En yeni stable|2027-08"
    # MySQL
    ["mysql:8.0"]="MySQL 8.0 (LTS)|EOL Nis 2026 — Oracle LTS|2026-04"
    ["mysql:8.4"]="MySQL 8.4 (LTS)|EOL Nis 2032 — yeni LTS|2032-04"
)

# ── Live discovery (best effort) ────────────────────────────────────────────
DISCOVERED_VERSIONS=()

if command -v dnf >/dev/null 2>&1; then
    # MariaDB modules
    while IFS= read -r line; do
        VER=$(echo "${line}" | grep -oE '[0-9]+\.[0-9]+' | head -1)
        [[ -n "${VER}" ]] && DISCOVERED_VERSIONS+=("mariadb:${VER}")
    done < <(dnf module list mariadb 2>/dev/null | grep -E '^\s*mariadb\s' || true)

    # MySQL modules
    while IFS= read -r line; do
        VER=$(echo "${line}" | grep -oE '[0-9]+\.[0-9]+' | head -1)
        [[ -n "${VER}" ]] && DISCOVERED_VERSIONS+=("mysql:${VER}")
    done < <(dnf module list mysql 2>/dev/null | grep -E '^\s*mysql\s' || true)
fi

if command -v apt-cache >/dev/null 2>&1; then
    while IFS= read -r pkg; do
        VER=$(echo "${pkg}" | grep -oE 'mariadb-server-[0-9]+\.[0-9]+' | sed 's/mariadb-server-//')
        [[ -n "${VER}" ]] && DISCOVERED_VERSIONS+=("mariadb:${VER}")
    done < <(apt-cache search '^mariadb-server-[0-9]' 2>/dev/null || true)

    while IFS= read -r pkg; do
        VER=$(echo "${pkg}" | grep -oE 'mysql-server-[0-9]+\.[0-9]+' | sed 's/mysql-server-//')
        [[ -n "${VER}" ]] && DISCOVERED_VERSIONS+=("mysql:${VER}")
    done < <(apt-cache search '^mysql-server-[0-9]' 2>/dev/null || true)
fi

# Fallback: paket yöneticisi bulunmadıysa veya hiç sonuç dönmediyse,
# bilinen versiyon kataloğunu kullan
if [[ ${#DISCOVERED_VERSIONS[@]} -eq 0 ]]; then
    DISCOVERED_VERSIONS=("${!KNOWN_VERSIONS[@]}")
fi

# Unique sort
mapfile -t UNIQUE_VERSIONS < <(printf '%s\n' "${DISCOVERED_VERSIONS[@]}" | sort -u)

# ── Build JSON output ───────────────────────────────────────────────────────
TARGETS_JSON="["
FIRST=1
for key in "${UNIQUE_VERSIONS[@]}"; do
    ENGINE="${key%%:*}"
    VERSION="${key##*:}"
    META="${KNOWN_VERSIONS[${key}]:-${ENGINE^} ${VERSION}|Discovered from repo|}"
    LABEL="${META%%|*}"
    REST="${META#*|}"
    NOTE="${REST%%|*}"
    EOL="${REST#*|}"

    [[ ${FIRST} -eq 0 ]] && TARGETS_JSON+=","
    FIRST=0
    TARGETS_JSON+=$(jq -n --arg e "${ENGINE}" --arg v "${VERSION}" \
        --arg l "${LABEL}" --arg n "${NOTE}" --arg eol "${EOL}" \
        '{engine:$e, version:$v, label:$l, note:$n, eol:$eol}')
done
TARGETS_JSON+="]"

FETCHED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

RESULT=$(jq -n \
    --arg fetched_at "${FETCHED_AT}" \
    --arg source "live" \
    --argjson targets "${TARGETS_JSON}" \
    '{fetched_at: $fetched_at, source: $source, targets: $targets}')

# Cache it
echo "${RESULT}" > "${CACHE_FILE}"

echo "${RESULT}"
