#!/bin/bash
#
# Sertlestirme atisi: ayni paketi RASTGELE SIRADA defalarca kosar.
#
# ── Ne ariyor ──────────────────────────────────────────────────────────────
#
# Testler her zaman ayni sirada kostugunda, aralarindaki gizli bagimlilik
# gorunmez: B testi A'nin biraktigi veriyle geciyorsa, ikisi hep bu sirada
# kostugu icin kimse fark etmez. Sira degisince duser.
#
# ⛔ Bu bizde teorik degil. EGT-75'te olculdu: 99 test dosyasi izolasyonsuzdu.
# `RefreshDatabase` varsayilan yapildi, ama o duzeltme yalniz VERITABANINI
# kapsar — cache, sahte zaman, statik durum ve kuyruk hala sizabilir.
#
# ── Neden nightly degil ────────────────────────────────────────────────────
#
# Sets, 07.08.2026: *"bunu nightly yapmaya gerek yok. Hardening icin 10 dakika
# ara ile rastgele 20-25 kere calistiririz, bu zaten bize dikkat cekici bir
# bulgu verir ya da vermez."* Her gece kosan bir is, bulgusu tukendikten sonra
# yalnizca gurultu uretir; atis bir soruyu cevaplar ve biter.
#
# ── Kullanim ───────────────────────────────────────────────────────────────
#
#   deployment/scripts/harden.sh              # 20 kosu, aralikSiz
#   RUNS=25 GAP=600 deployment/scripts/harden.sh   # 25 kosu, 10 dk arayla
#
# Her kosunun TOHUMU yazilir: bir kirilma bulundugunda ayni sira
# `--random-order-seed=<tohum>` ile birebir tekrar uretilebilir. Tekrar
# uretilemeyen bir bulgu, duzeltildigini de kanitlayamaz.
#
set -uo pipefail

RUNS="${RUNS:-20}"
GAP="${GAP:-0}"
LOG="${LOG:-storage/logs/harden-$(date +%Y%m%d-%H%M%S).log}"

# ⚠ omurga-rls disarida: paralel kosmaz ve kendi kosumunda zaten sirali
# calisir (chunk2 §2.11). Sira karistirmanin aradigi kusur orada degil.
# ⛔ `GROUPS` DEGIL: bash'in kendi ozel degiskeni (cagiranin grup id'leri) ve
# ona yapilan atama yutulur — ilk kosumda dongu `20`, `12`, `61` gibi sayilar
# uzerinde dondu ve her biri "No tests found" ile dustu. Kabuk degiskeni
# adlandirirken builtin'lerin uzerine yazmamak gerekiyor.
TEST_GROUPS=(omurga backoffice planlama satis egitmen musteri katilimci entegrasyon mevzuat)

say()  { printf '\033[1;36m→\033[0m %s\n' "$1"; }
bad()  { printf '\033[1;31m✗\033[0m %s\n' "$1"; }
ok()   { printf '\033[1;32m✓\033[0m %s\n' "$1"; }

mkdir -p "$(dirname "$LOG")"
say "Sertlestirme atisi: ${RUNS} kosu, ${GAP}sn aralik → ${LOG}"

FAILURES=0

for ((i = 1; i <= RUNS; i++)); do
    # Tohum kaydedilir ki bulgu tekrar uretilebilsin.
    SEED=$((RANDOM * 32768 + RANDOM))

    printf '\n[%02d/%02d] tohum=%s\n' "$i" "$RUNS" "$SEED" | tee -a "$LOG"

    for group in "${TEST_GROUPS[@]}"; do
        if ! ./vendor/bin/pest --group="$group" --order-by=random \
             --random-order-seed="$SEED" --compact >>"$LOG" 2>&1; then
            bad "kosu ${i}, grup ${group} DUSTU (tohum ${SEED})"
            printf 'DUSTU grup=%s tohum=%s\n' "$group" "$SEED" >>"$LOG"
            FAILURES=$((FAILURES + 1))
        fi
    done

    printf '  bitti\n'

    if [[ $GAP -gt 0 && $i -lt $RUNS ]]; then
        sleep "$GAP"
    fi
done

echo
if [[ $FAILURES -gt 0 ]]; then
    bad "${FAILURES} kirilma. Tohumlar ${LOG} icinde — ayni sira birebir tekrar uretilebilir."
    exit 1
fi

ok "${RUNS} kosunun hepsi rastgele sirada gecti. Sira bagimliligi bulunamadi."
