#!/usr/bin/env bash
#
# Projenin PHP yorumlayicisi — TEK yerden.
#
# ⛔ NEDEN VAR (Sets, 11.08.2026: "8.5 projenin php surumu, buna gore
# calissin"). Iki script ayni soruyu iki farkli sekilde cevapliyordu ve bir
# deploy tam bu yuzden durdu: `deploy.sh` "kurulu olanlarin EN YENISI"ni
# ariyordu, `preflight.sh` ise ciplak `php`ye dusuyordu — Hetzner'de o 8.3.32.
# Yani deploy dogru yorumlayiciyi buluyor, kendi on kosul kontrolu yanlisiyla
# bakip "karsilanmiyor" diyordu.
#
# ⛔ Ve "en yenisi" zaten yanlis soruydu. Makineye yarin php8.6 kurulursa proje
# sessizce ona gecer — kimse istemeden, kimse gormeden. Surum bir tercihtir ve
# tercihi PROJE bildirir: `.php-version`. Betikler onu okur, tahmin etmez.
#
# ── Kullanim ───────────────────────────────────────────────────────────────
#
#   source "$(dirname "${BASH_SOURCE[0]}")/php-bin.sh"
#   "$PHP_BIN" artisan ...
#   "${COMPOSER_CMD[@]}" install ...
#
# ⚠ PHP_BIN disaridan verilirse ona dokunulmaz: bir makinede yorumlayici baska
# bir adla durabilir ve script'in son sozu operatorde olmalidir.

_php_version_file() {
    local root
    root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"

    [ -r "${root}/.php-version" ] || return 1

    tr -d ' \t\r\n' < "${root}/.php-version"
}

# ⚠ `php8.5` once, ciplak `php` sonra — ve ciplak olan yalnizca DOGRU SURUMU
# tasiyorsa. Gelistirme makinesinde tek bir php kurulu olabilir ve adinda surum
# yazmaz; sunucuda uc tane vardir ve ciplak olan yanlistir.
_resolve_php() {
    local wanted="$1" candidate

    for candidate in "php${wanted}" php; do
        command -v "$candidate" >/dev/null 2>&1 || continue

        [ "$("$candidate" -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;' 2>/dev/null)" = "$wanted" ] || continue

        printf '%s' "$candidate"

        return 0
    done

    return 1
}

PHP_WANTED="$(_php_version_file || true)"

if [ -z "${PHP_BIN:-}" ]; then
    if [ -z "$PHP_WANTED" ]; then
        printf '\033[1;31m✗\033[0m .php-version okunamadi — projenin PHP surumu bildirilmemis.\n' >&2
        exit 1
    fi

    if ! PHP_BIN="$(_resolve_php "$PHP_WANTED")"; then
        printf '\033[1;31m✗\033[0m PHP %s bulunamadi (proje .php-version ile bunu istiyor).\n' "$PHP_WANTED" >&2
        printf '   \033[2m→ Kurulu surumler: %s\033[0m\n' \
            "$(compgen -c 'php8.' 2>/dev/null | sort -Vu | tr '\n' ' ')" >&2
        printf '   \033[2m→ Baska bir adla duruyorsa: PHP_BIN=/yol/php\033[0m\n' >&2
        exit 1
    fi
fi

export PHP_BIN

# ⛔ COMPOSER BIRDEN COK KELIME OLABILIR, ve olmak zorunda kaldi (09.08.2026).
#
# `/usr/local/bin/composer` bir phar ve shebang'i `#!/usr/bin/env php` — yani
# hangi PHP ile calisacagina PATH karar verir. Sunucuda PATH'teki php 8.3'tur:
# `composer install` orada 8.3 icin bagimlilik cozer ve uygulama ilk istekte,
# deploy "basarili" dedikten sonra patlar. Cozum composer'i acikca dogru
# yorumlayiciya vermek — ve bunu artik operatorun hatirlamasi gerekmiyor.
#
# ⚠ Dizi olarak: tirnakli tek bir degisken olarak calistirilsaydi kabuk onu tek
# bir dosya adi sayar ve "command not found" verirdi.
if [ -z "${COMPOSER_BIN:-}" ]; then
    _composer_phar="$(command -v composer 2>/dev/null || true)"

    if [ -n "$_composer_phar" ]; then
        COMPOSER_BIN="${PHP_BIN} ${_composer_phar}"
    else
        COMPOSER_BIN="composer"
    fi
fi

export COMPOSER_BIN

read -r -a COMPOSER_CMD <<< "$COMPOSER_BIN"
