package main

import (
	"encoding/json"
	"os"
	"path/filepath"
	"testing"
)

// Ayni site tek kayit olmali: tekrar kaydetmede eslesmeler.json sismemeli,
// TokenOzeti guncellenmeli (eski token gecersiz olmali).
// Not: eslesmeKaydetVeyaGuncelle OZET saklar (esleHandler tokenOzeti(token) cagirir);
// eslesmisTokenMi ise HAM token alip ozetler. Bu yuzden kayit tokenOzeti(ham) ile yapilir.
func TestEslesmeKaydetVeyaGuncelleTekKayit(t *testing.T) {
	t.Setenv("APPDATA", t.TempDir())

	if err := eslesmeKaydetVeyaGuncelle(izinliKoken, tokenOzeti("token-a")); err != nil {
		t.Fatal(err)
	}
	if err := eslesmeKaydetVeyaGuncelle(izinliKoken, tokenOzeti("token-b")); err != nil {
		t.Fatal(err)
	}

	liste := eslesmeleriOku()
	if len(liste) != 1 {
		t.Fatalf("tek kayit beklenirdi, %d kayit var", len(liste))
	}
	if liste[0].TokenOzeti != tokenOzeti("token-b") {
		t.Fatalf("TokenOzeti token-b'nin ozeti olmali")
	}
	// Eski token gecersiz, yenisi gecerli.
	if !eslesmisTokenMi("token-b") {
		t.Fatal("yeni token gecerli olmali")
	}
	if eslesmisTokenMi("token-a") {
		t.Fatal("eski token gecersiz olmali")
	}
}

// siteEslesmisMi: kayit varsa true, yoksa false.
func TestSiteEslesmisMi(t *testing.T) {
	t.Setenv("APPDATA", t.TempDir())

	if siteEslesmisMi(izinliKoken) {
		t.Fatal("bos depoda eslesmemis sayilmali")
	}
	if err := eslesmeKaydetVeyaGuncelle(izinliKoken, tokenOzeti("token")); err != nil {
		t.Fatal(err)
	}
	if !siteEslesmisMi(izinliKoken) {
		t.Fatal("kayit sonrasi eslesmis sayilmali")
	}
	if siteEslesmisMi("https://diger.com") {
		t.Fatal("baska site eslesmis sayilmamali")
	}
}

// eslesmeKaldir sonrasi token gecersiz olmali (site yeniden eslesebilir).
func TestEslesmeKaldirSonrasiTokenGecersiz(t *testing.T) {
	t.Setenv("APPDATA", t.TempDir())

	if err := eslesmeKaydetVeyaGuncelle(izinliKoken, tokenOzeti("token")); err != nil {
		t.Fatal(err)
	}
	if !eslesmisTokenMi("token") {
		t.Fatal("once gecerli olmali")
	}
	// Bos listeye dusur: site artik eslesmemis.
	if err := eslesmeleriYaz(nil); err != nil {
		t.Fatal(err)
	}
	if eslesmisTokenMi("token") {
		t.Fatal("kaldirimdan sonra token gecersiz olmali")
	}
	if siteEslesmisMi(izinliKoken) {
		t.Fatal("kaldirimdan sonra eslesmemis olmali")
	}
}

// eslesmeler.json okunabilir bicimde yazilmali (birden fazla site ayri satir).
func TestEslesmeDosyaBicimi(t *testing.T) {
	t.Setenv("APPDATA", t.TempDir())

	_ = eslesmeKaydetVeyaGuncelle("https://a.com", tokenOzeti("token-a"))
	_ = eslesmeKaydetVeyaGuncelle("https://b.com", tokenOzeti("token-b"))

	yol, err := eslesDosyasi()
	if err != nil {
		t.Fatal(err)
	}
	veri, err := os.ReadFile(yol)
	if err != nil {
		t.Fatal(err)
	}
	var liste []eslesme
	if json.Unmarshal(veri, &liste) != nil || len(liste) != 2 {
		t.Fatalf("iki ayri site beklenirdi: %s", filepath.Base(yol))
	}
}
