package main

import (
	"path/filepath"
	"testing"
	"time"
)

func TestDosyaIzinliMi(t *testing.T) {
	simdi := time.Date(2026, 10, 14, 12, 0, 0, 0, time.UTC)
	kok := filepath.Join("D:\\", "Veriler")
	yasak := []string{"C:\\Windows", "D:\\Veriler\\Gizli"}
	y := DosyaIzinleri{Klasorler: []DosyaKlasorIzni{
		{Kok: kok, Islemler: []string{"oku"}, Bitis: simdi.Add(time.Hour).Unix()},
	}}
	icerde := filepath.Join(kok, "rapor.txt")
	if !dosyaIzinliMi(y, icerde, "oku", simdi, yasak) {
		t.Fatal("izinli klasorde okuma reddedildi")
	}
	if dosyaIzinliMi(y, icerde, "yaz", simdi, yasak) {
		t.Fatal("izin verilmeyen yazma kabul edildi")
	}
	if dosyaIzinliMi(y, "D:\\Baska\\a.txt", "oku", simdi, yasak) {
		t.Fatal("izin disi klasor kabul edildi")
	}
	if !dosyaIzinliMi(y, icerde, "oku", simdi, yasak) {
		t.Fatal("bu tekrar beklenmiyor")
	}
	// suresi dolmus izin
	bitti := DosyaIzinleri{Klasorler: []DosyaKlasorIzni{
		{Kok: kok, Islemler: []string{"oku"}, Bitis: simdi.Add(-time.Minute).Unix()},
	}}
	if dosyaIzinliMi(bitti, icerde, "oku", simdi, yasak) {
		t.Fatal("suresi dolmus izin kabul edildi")
	}
	// yasak klasor: tam erisim olsa bile kapali
	tam := DosyaIzinleri{TamErisim: simdi.Add(time.Hour).Unix()}
	if dosyaIzinliMi(tam, "C:\\Windows\\system32\\a.dll", "oku", simdi, yasak) {
		t.Fatal("yasak klasor tam erisimle acildi")
	}
	if !dosyaIzinliMi(tam, "D:\\Baska\\a.txt", "sil", simdi, yasak) {
		t.Fatal("tam erisim acikken izinli yol reddedildi")
	}
	// yasak alt klasor, izin veren ust klasorun icinde
	if dosyaIzinliMi(y, "D:\\Veriler\\Gizli\\x.txt", "oku", simdi, yasak) {
		t.Fatal("yasak alt klasor izin ust klasorden acildi")
	}
}

func TestKlasorIzniEkleBirlestir(t *testing.T) {
	simdi := time.Now()
	liste := klasorIzniEkle(nil, "D:\\A", []string{"oku"}, simdi.Add(time.Hour).Unix())
	liste = klasorIzniEkle(liste, "d:\\a", []string{"yaz"}, simdi.Add(2*time.Hour).Unix())
	if len(liste) != 1 || len(liste[0].Islemler) != 2 {
		t.Fatalf("birlestirme hatali: %+v", liste)
	}
	liste = klasorIzniKaldir(liste, "D:\\A")
	if len(liste) != 0 {
		t.Fatal("kaldirma calismadi")
	}
}
