package main

// Olay gunlugu: bridge'in onemli olaylari (giris, eslesme, izinler, socket baglantisi).
//   - Son olaylar bellekte tutulur (ayar sayfasinda gosterilir).
//   - Tum olaylar bridge.log dosyasina JSON satiri olarak eklenir (1 MB'da dondurulur).
//   - Hassas veri (parola, token, gizli anahtar) ASLA yazilmaz; cagiran taraf dikkat etmeli.

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"os"
	"path/filepath"
	"strings"
	"sync"
	"time"
)

const (
	olayBellekLimit = 300
	olayDosyaLimit  = 1 << 20 // 1 MB
)

type olayKaydi struct {
	Zaman  string `json:"zaman"`
	Seviye string `json:"seviye"` // bilgi | uyari
	Mesaj  string `json:"mesaj"`
}

var (
	olayMu    sync.Mutex
	olayListe []olayKaydi
)

// olayLog: log.Printf yerine kullanilir; hem konsola hem gunlege yazar.
// Bicimde "%v" (hata) varsa seviye "uyari" olur.
func olayLog(bicim string, args ...any) {
	mesaj := fmt.Sprintf(bicim, args...)
	log.Print(mesaj)
	seviye := "bilgi"
	if strings.Contains(bicim, "%v") {
		seviye = "uyari"
	}
	k := olayKaydi{Zaman: time.Now().Format("2006-01-02 15:04:05"), Seviye: seviye, Mesaj: mesaj}

	olayMu.Lock()
	olayListe = append(olayListe, k)
	if len(olayListe) > olayBellekLimit {
		olayListe = olayListe[len(olayListe)-olayBellekLimit:]
	}
	olayMu.Unlock()

	olayDosyayaYaz(k)
	sokGunlukGonder(k)
}

func olayDosyayaYaz(k olayKaydi) {
	klasor, err := veriKlasoru()
	if err != nil {
		return
	}
	yol := filepath.Join(klasor, "bridge.log")
	if st, err := os.Stat(yol); err == nil && st.Size() > olayDosyaLimit {
		_ = os.Rename(yol, yol+".1") // eski gunlugu sakla, yenisine basla
	}
	f, err := os.OpenFile(yol, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600)
	if err != nil {
		return
	}
	defer f.Close()
	satir, _ := json.Marshal(k)
	_, _ = f.Write(append(satir, '\n'))
}

func olaylariGetir() []olayKaydi {
	olayMu.Lock()
	defer olayMu.Unlock()
	kopya := make([]olayKaydi, len(olayListe))
	copy(kopya, olayListe)
	return kopya
}

// ayarlarLoglarHandler: yalnizca yerel ayar sayfasi okur.
func ayarlarLoglarHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodGet {
		http.Error(w, "yalnizca GET", http.StatusMethodNotAllowed)
		return
	}
	if !yerelIstek(w, r) {
		return
	}
	yazJSON(w, http.StatusOK, olaylariGetir())
}
