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.7.1"

func main() {
	// Her etkin hesabin verisi kendi profilinden yuklenir; tum hesaplar ayni anda aktiftir.
	for _, a := range etkinHesaplar() {
		if err := dosyaIzinleriYukle(a); err != nil {
			olayLog("dosya izinleri okunamadi (%s): %v", a, err)
		}
		if err := izinleriYukleProfil(a); err != nil {
			olayLog("izinler okunamadi (%s, varsayilan: hepsi kapali): %v", a, err)
		}
		if err := kuruluYukleProfil(a); err != nil {
			olayLog("kurulu eklenti listesi okunamadi (%s): %v", a, err)
		}
	}

	for _, a := range etkinHesaplar() {
		if err := yetkiYukleProfil(a); err != nil {
			olayLog("yetkiler okunamadi (%s): %v", a, 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", ayarlarAnaHandler)
	mux.HandleFunc("/ayarlar/hesap/", ayarlarHesapHandler)
	mux.HandleFunc("/ayarlar/izin", izinDegistirHandler)
	mux.HandleFunc("/ayarlar/eslesme-kaldir", eslesmeKaldirHandler)
	mux.HandleFunc("/ayarlar/izin-iptal", izinIptalHandler)
	mux.HandleFunc("/ayarlar/klasor-iptal", klasorIptalHandler)
	mux.HandleFunc("/ayarlar/izin-hepsi", tumIzinIptalHandler)
	mux.HandleFunc("/ayarlar/loglar", oturumGerekli(ayarlarLoglarHandler))
	mux.HandleFunc("/ayarlar/izinler", ayarlarIzinHandler)
	mux.HandleFunc("/ayarlar/guncelleme", oturumGerekli(ayarlarGuncellemeHandler))
	mux.HandleFunc("/ayarlar/dosya-izin", 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("/eklenti/yerel-ayar", yerelEklentiAyarHandler)
	mux.HandleFunc("/cihaz", korumali(cihazKimlikHandler))
	mux.HandleFunc("/profiller", profilListeHandler)
	mux.HandleFunc("/profiller/etkinle", profilEtkinleHandler)
	mux.HandleFunc("/profiller/cikar", profilCikarHandler)

	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()
	profilSocketleriBaslat()
	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 := cihazKimligiProfil(profilDe(r))
	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
	}
	k, giris := ilkOturum()
	// Web, kendi hesabinin koprude girisli olup olmadigini "kullanicilar" listesinden anlar.
	// "kullanici" eski web surumleri icin ilk oturumun hesabidir.
	kullanici := ""
	if giris && k != nil {
		kullanici = k.KullaniciAdi
	}
	yazJSON(w, http.StatusOK, map[string]any{"ok": true, "surum": surum, "giris": giris, "kullanici": kullanici, "kullanicilar": girisYapanKullanicilar(), "eslesme": len(eslesmeleriOku()) > 0})
}
