package main

import (
	"encoding/json"
	"net/http"
	"testing"
)

const testProfil = "ahmet"

func kuruluSifirla(t *testing.T) {
	t.Helper()
	t.Setenv("APPDATA", t.TempDir())
	kuruluMu.Lock()
	kuruluListeler = map[string][]kuruluEklenti{}
	kuruluMu.Unlock()
}

func TestKuruluListeKopya(t *testing.T) {
	kuruluSifirla(t)
	if err := kuruluEkleProfil(testProfil, kuruluEklenti{Anahtar: "everything", Surum: "1.0.0", Etkin: true}); err != nil {
		t.Fatal(err)
	}
	liste := kuruluListeKopyaProfil(testProfil)
	if len(liste) != 1 || !liste[0].Etkin || liste[0].Surum != "1.0.0" {
		t.Fatalf("kurulu liste beklenmeyen: %+v", liste)
	}
}

// Gecersiz istekler sokete hic gitmeden reddedilmeli (PC onayi istenmemeli).
func TestEklentiIstegiGecersizReddedilir(t *testing.T) {
	kuruluSifirla(t)
	for _, ham := range []string{
		`{"id":"1","islem":"kaldir","anahtar":"../x"}`,
		`{"id":"1","islem":"bilinmeyen","anahtar":"everything"}`,
		`{"islem":"kaldir","anahtar":"everything"}`,
		`bozuk`,
	} {
		eklentiIstegiIsle(testProfil, json.RawMessage(ham))
	}
}

func TestSocketHataMetni(t *testing.T) {
	if socketHataMetni(http.StatusForbidden, nil) != "kullanıcı reddetti" {
		t.Fatal("403 metni yanlis")
	}
	if socketHataMetni(http.StatusTooManyRequests, nil) == "" {
		t.Fatal("429 metni bos")
	}
}

// Kurulu liste yeniden baslatmadan sonra diskten geri yuklenmeli.
func TestKuruluListeYenidenBaslatmadaKalir(t *testing.T) {
	kuruluSifirla(t)
	if err := kuruluEkleProfil(testProfil, kuruluEklenti{Anahtar: "everything", Surum: "1.0.0", Etkin: true}); err != nil {
		t.Fatal(err)
	}
	// Yeniden baslatmayi taklit et: bellek bossalt, diskten yukle.
	kuruluMu.Lock()
	kuruluListeler = map[string][]kuruluEklenti{}
	kuruluMu.Unlock()
	if err := kuruluYukleProfil(testProfil); err != nil {
		t.Fatal(err)
	}
	liste := kuruluListeKopyaProfil(testProfil)
	if len(liste) != 1 || liste[0].Anahtar != "everything" || !liste[0].Etkin {
		t.Fatalf("yeniden baslatmadan sonra kurulu liste kayboldu: %+v", liste)
	}
}
