package main

// fikoyt-local-bridge: fikoyt.com web arayuzu ile yerel uygulamalar arasinda
// KONTROLLU bir kopru. Ilkeler:
//   - Yalnizca 127.0.0.1 dinler.
//   - Host ve Origin dogrulanir (DNS yeniden baglama ve siteler arasi istek koruması).
//   - Ilk acilista fikoyt.com girisi zorunludur; korunan uclar giris olmadan kapali.
//   - Izinler YALNIZCA yerel arayuzden verilir; web arayuzu izin veremez.
//   - Dosya yazma/silme ve keyfi komut ucu YOKTUR.

import (
	"net/http"
	"os"
	"time"
)

const dinleAdres = "127.0.0.1:7878"
const surum = "0.4.2"

func main() {
	if err := dosyaIzinleriYukle(); err != nil {
		olayLog("dosya izinleri okunamadi: %v", err)
	}
	if err := izinleriYukle(); err != nil {
		olayLog("izinler okunamadi (varsayilan: hepsi kapali): %v", err)
	}

	if err := yetkiYukle(); err != nil {
		olayLog("yetkiler okunamadi: %v", err)
	}
	// Kurulu eklentileri diskten yukle; yoksa acilista liste bos kalir ve sonraki kayit onlari siler.
	if err := kuruluYukle(); err != nil {
		olayLog("kurulu eklenti listesi okunamadi: %v", err)
	}
	// Acilista baslatma: yalnizca kurulumda onaylanmis, etkin eklentiler (her acilista PC onayi yok).
	guncellemeBaslangic()
	go acilisiBaslat()
	mux := http.NewServeMux()
	mux.HandleFunc("/health", healthHandler)
	mux.HandleFunc("/giris", girisHandler)
	mux.HandleFunc("/cikis", oturumKapatHandler)
	mux.HandleFunc("/ayarlar", ayarlarHandler)
	mux.HandleFunc("/ayarlar/izin", oturumGerekli(izinDegistirHandler))
	mux.HandleFunc("/ayarlar/eslesme-kaldir", oturumGerekli(eslesmeKaldirHandler))
	mux.HandleFunc("/ayarlar/loglar", oturumGerekli(ayarlarLoglarHandler))
	mux.HandleFunc("/ayarlar/izinler", oturumGerekli(ayarlarIzinHandler))
	mux.HandleFunc("/ayarlar/guncelleme", oturumGerekli(ayarlarGuncellemeHandler))
	mux.HandleFunc("/ayarlar/dosya-izin", oturumGerekli(dosyaIzinHandler))
	mux.HandleFunc("/esles", esleHandler)
	mux.HandleFunc("/izin-iste", korumali(izinIsteHandler))
	mux.HandleFunc("/izin-kaldir", korumali(izinKaldirHandler))
	mux.HandleFunc("/onay/karar", onayKararHandler)
	mux.HandleFunc("/onay/", onayHandler)
	mux.HandleFunc("/", durumHandler)
	mux.HandleFunc("/izinler", korumali(izinlerHandler))
	eklentileriKur(mux)
	mux.HandleFunc("/eklenti/kur", korumali(oturumGerekli(eklentiKurHandler)))
	mux.HandleFunc("/eklenti/kurulu", korumali(eklentiKuruluHandler))
	mux.HandleFunc("/eklenti/cagir", korumali(oturumGerekli(kuruluEklentiCagirHandler)))
	mux.HandleFunc("/eklenti/yerel", yerelEklentiHandler)
	mux.HandleFunc("/cihaz", korumali(cihazKimlikHandler))

	srv := &http.Server{
		Addr:              dinleAdres,
		Handler:           hostVeOriginKontrol(mux),
		ReadHeaderTimeout: 10 * time.Second,
	}
	olayLog("FikoYT Yerel Köprü %s dinliyor: %s", surum, dinleAdres)
	go func() {
		if err := srv.ListenAndServe(); err != nil {
			olayLog("sunucu durdu: %v", err)
		}
		os.Exit(1)
	}()
	go cihazSenkronDongusu()
	go guncellemeDongusu()
	trayBaslat()
}

// cihazKimlikHandler: web bu bilgisayari listedeki cihazlar arasinda bulmak icin kullanir.
// Yalnizca eslesmis token ile erisilir; kimlik disari yalnizca bu yolla verilir.
func cihazKimlikHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodGet {
		http.Error(w, "yalnizca GET", http.StatusMethodNotAllowed)
		return
	}
	kimlik, err := cihazKimligi()
	if err != nil {
		http.Error(w, "kimlik okunamadi", http.StatusInternalServerError)
		return
	}
	yazJSON(w, http.StatusOK, map[string]any{"cihazKimlik": kimlik})
}

func healthHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodGet {
		http.Error(w, "yalnizca GET", http.StatusMethodNotAllowed)
		return
	}
	_, err := oturumOku()
	yazJSON(w, http.StatusOK, map[string]any{"ok": true, "surum": surum, "giris": err == nil, "eslesme": len(eslesmeleriOku()) > 0})
}
