#!/usr/bin/env bash
set -u

surum="1.0.0"
disk_testi=0
ag_testi=0
ag_sunucu=""
ag_port="5201"

renk_var=0
if [ -t 1 ]; then renk_var=1; fi

renk(){
    if [ "$renk_var" -eq 1 ]; then printf '\033[%sm%s\033[0m' "$1" "$2"; else printf '%s' "$2"; fi
}

baslik(){
    printf '\n'
    renk '1;36' "== $1 =="
    printf '\n'
}

satir(){
    printf '%-24s %s\n' "$1" "$2"
}

komut_var(){ command -v "$1" >/dev/null 2>&1; }

insan_byte(){
    local deger="${1:-0}"
    if komut_var numfmt; then numfmt --to=iec-i --suffix=B "$deger" 2>/dev/null || printf '%s B' "$deger"; else printf '%s B' "$deger"; fi
}

kullanim(){
    cat <<'EOF'
Eka Sunucu Benchmark 1.0.0

Kullanım:
  bash eka-sunucu-benchmark.sh --hizli
  bash eka-sunucu-benchmark.sh --disk
  bash eka-sunucu-benchmark.sh --ag SUNUCU [PORT]
  bash eka-sunucu-benchmark.sh --tam SUNUCU [PORT]

Seçenekler:
  --hizli          Sistem ve kısa CPU ölçümü
  --disk           Sistem, CPU ve fio disk testi
  --ag SUNUCU      Sistem, CPU ve iperf3 ağ testi
  --tam SUNUCU     Sistem, CPU, disk ve ağ testi
  --surum          Sürümü göster
  --yardim         Yardımı göster
EOF
}

while [ "$#" -gt 0 ]; do
    case "$1" in
        --hizli) shift ;;
        --disk) disk_testi=1; shift ;;
        --ag)
            ag_testi=1
            if [ "$#" -lt 2 ]; then printf 'Hata: --ag için sunucu adresi gerekli.\n' >&2; exit 2; fi
            ag_sunucu="$2"
            if [ "$#" -ge 3 ] && [[ "$3" =~ ^[0-9]+$ ]]; then ag_port="$3"; shift 3; else shift 2; fi
            ;;
        --tam)
            disk_testi=1
            ag_testi=1
            if [ "$#" -lt 2 ]; then printf 'Hata: --tam için iperf3 sunucu adresi gerekli.\n' >&2; exit 2; fi
            ag_sunucu="$2"
            if [ "$#" -ge 3 ] && [[ "$3" =~ ^[0-9]+$ ]]; then ag_port="$3"; shift 3; else shift 2; fi
            ;;
        --surum) printf '%s\n' "$surum"; exit 0 ;;
        --yardim|-h|--help) kullanim; exit 0 ;;
        *) printf 'Bilinmeyen seçenek: %s\n' "$1" >&2; kullanim; exit 2 ;;
    esac
done

baslik "Eka Sunucu Benchmark"
satir "Sürüm" "$surum"
satir "Zaman" "$(date -u '+%Y-%m-%d %H:%M:%S UTC' 2>/dev/null || date)"
satir "Yetki" "$(id -un 2>/dev/null || printf 'bilinmiyor')"

baslik "Sistem"
if [ -r /etc/os-release ]; then
    . /etc/os-release
    satir "İşletim sistemi" "${PRETTY_NAME:-${NAME:-Linux}}"
else
    satir "İşletim sistemi" "$(uname -s 2>/dev/null || printf 'Linux')"
fi
satir "Kernel" "$(uname -r 2>/dev/null || printf 'bilinmiyor')"
satir "Mimari" "$(uname -m 2>/dev/null || printf 'bilinmiyor')"
satir "Hostname" "$(hostname 2>/dev/null || printf 'bilinmiyor')"
if komut_var systemd-detect-virt; then satir "Sanallaştırma" "$(systemd-detect-virt 2>/dev/null || printf 'none')"; fi

baslik "CPU"
if komut_var lscpu; then
    cpu_model="$(lscpu | awk -F: '/Model name/{sub(/^[ \t]+/,"",$2); print $2; exit}')"
    cpu_soket="$(lscpu | awk -F: '/Socket\(s\)/{gsub(/[ \t]/,"",$2); print $2; exit}')"
    cpu_cekirdek="$(lscpu | awk -F: '/Core\(s\) per socket/{gsub(/[ \t]/,"",$2); print $2; exit}')"
    cpu_is_parcasi="$(lscpu | awk -F: '/^CPU\(s\)/{gsub(/[ \t]/,"",$2); print $2; exit}')"
    satir "Model" "${cpu_model:-bilinmiyor}"
    satir "Soket" "${cpu_soket:-bilinmiyor}"
    satir "Çekirdek/soket" "${cpu_cekirdek:-bilinmiyor}"
    satir "Mantıksal CPU" "${cpu_is_parcasi:-bilinmiyor}"
else
    satir "Mantıksal CPU" "$(getconf _NPROCESSORS_ONLN 2>/dev/null || printf 'bilinmiyor')"
fi
if komut_var openssl; then
    printf '\nOpenSSL SHA-256 kısa ölçümü:\n'
    openssl speed -seconds 3 sha256 2>&1 | awk '/sha256/{son=$0} END{if(son) print son}'
else
    printf 'OpenSSL bulunamadı; CPU mikro testi atlandı.\n'
fi

baslik "Bellek"
if komut_var free; then
    free -h | awk 'NR==1 || /^Mem:/ || /^Swap:/'
elif [ -r /proc/meminfo ]; then
    awk '/MemTotal|MemAvailable|SwapTotal|SwapFree/{print}' /proc/meminfo
else
    printf 'Bellek bilgisi alınamadı.\n'
fi

baslik "Depolama"
if komut_var df; then df -hT / 2>/dev/null || df -h /; fi
if komut_var lsblk; then lsblk -d -o NAME,SIZE,ROTA,TYPE,MODEL 2>/dev/null || true; fi

if [ "$disk_testi" -eq 1 ]; then
    baslik "fio Disk Testi"
    if ! komut_var fio; then
        printf 'fio bulunamadı. Paket yöneticinizden fio kurup testi tekrar çalıştırabilirsiniz.\n'
    else
        gecici="$(mktemp -d "${TMPDIR:-/tmp}/eka-benchmark.XXXXXX")" || exit 1
        temizle(){ rm -rf "$gecici"; }
        trap temizle EXIT INT TERM
        dosya="$gecici/eka-test.bin"
        satir "Geçici test dosyası" "$dosya"
        satir "Test boyutu" "512 MiB"
        printf '\n4K rastgele okuma:\n'
        fio --name=eka_rand_okuma --filename="$dosya" --size=512M --rw=randread --bs=4k --ioengine=sync --direct=1 --iodepth=1 --runtime=6 --time_based --group_reporting 2>/dev/null | awk '/read: IOPS=/{print; bulundu=1} END{if(!bulundu) print "Sonuç satırı alınamadı."}'
        printf '\n4K rastgele yazma:\n'
        fio --name=eka_rand_yazma --filename="$dosya" --size=512M --rw=randwrite --bs=4k --ioengine=sync --direct=1 --iodepth=1 --runtime=6 --time_based --group_reporting 2>/dev/null | awk '/write: IOPS=/{print; bulundu=1} END{if(!bulundu) print "Sonuç satırı alınamadı."}'
        printf '\n1M sıralı okuma:\n'
        fio --name=eka_sirali_okuma --filename="$dosya" --size=512M --rw=read --bs=1M --ioengine=sync --direct=1 --iodepth=1 --runtime=6 --time_based --group_reporting 2>/dev/null | awk '/read: IOPS=/{print; bulundu=1} END{if(!bulundu) print "Sonuç satırı alınamadı."}'
        printf '\n1M sıralı yazma:\n'
        fio --name=eka_sirali_yazma --filename="$dosya" --size=512M --rw=write --bs=1M --ioengine=sync --direct=1 --iodepth=1 --runtime=6 --time_based --group_reporting 2>/dev/null | awk '/write: IOPS=/{print; bulundu=1} END{if(!bulundu) print "Sonuç satırı alınamadı."}'
        temizle
        trap - EXIT INT TERM
    fi
fi

if [ "$ag_testi" -eq 1 ]; then
    baslik "iperf3 Ağ Testi"
    if ! komut_var iperf3; then
        printf 'iperf3 bulunamadı. Paket yöneticinizden iperf3 kurup testi tekrar çalıştırabilirsiniz.\n'
    else
        satir "Hedef" "$ag_sunucu:$ag_port"
        iperf3 -c "$ag_sunucu" -p "$ag_port" -t 8 --connect-timeout 5000 2>&1 || true
    fi
fi

baslik "Not"
printf 'Bu betik sonuçları hiçbir dış servise yüklemez. Ağ testi yalnızca --ag veya --tam ile açıkça verdiğiniz iperf3 hedefine bağlanır.\n'
printf 'Benchmark sonucu tek başına SLA veya üretim performansı garantisi değildir; yoğunluk, sanallaştırma, güç politikası, dosya sistemi ve ağ yolu sonucu değiştirebilir.\n'
