package main

import (
	"encoding/json"
	"net/http"
)

// POST /ayarlar/eklenti-islem (yalnizca yerel arayuz: yerel Origin + CSRF).
// Govde: {"profil":"...","anahtar":"dosya-yoneticisi|everything","islem":"...","veri":{...}}
// Dosya-yoneticisi islemleri izin kontrolunden gecer; everything yalnizca "ara" yapar.
// Sonuc: {"tamam":true,"veri":...} ya da {"tamam":false,"hata":"..."}.
func yerelEklentiIslemHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "yalnizca POST", http.StatusMethodNotAllowed)
		return
	}
	if !yerelIstek(w, r) || !csrfDogrula(w, r) {
		return
	}
	if !herhangiOturumVar() {
		http.Error(w, "oturum yok", http.StatusUnauthorized)
		return
	}
	var istek struct {
		Profil  string          `json:"profil"`
		Anahtar string          `json:"anahtar"`
		Islem   string          `json:"islem"`
		Veri    json.RawMessage `json:"veri"`
	}
	r.Body = http.MaxBytesReader(w, r.Body, 2<<20)
	if err := json.NewDecoder(r.Body).Decode(&istek); err != nil {
		http.Error(w, "gecersiz istek", http.StatusBadRequest)
		return
	}
	if !profilAnahtarDesen.MatchString(istek.Profil) || !etkinMi(istek.Profil) {
		http.Error(w, "hesap etkin degil", http.StatusConflict)
		return
	}
	if len(istek.Veri) == 0 {
		istek.Veri = json.RawMessage("{}")
	}
	var cikti json.RawMessage
	var hata string
	switch istek.Anahtar {
	case dosyaEklentiAnahtari:
		cikti, hata = dosyaIslemYap(istek.Profil, istek.Islem, istek.Veri)
	case "everything":
		cikti, hata = everythingIslemYap(istek.Profil, istek.Islem, istek.Veri)
	case "pc-durum":
		cikti, hata = pcDurumIslemYap(istek.Profil, istek.Islem, istek.Veri)
	default:
		http.Error(w, "bu eklenti yerel arayuzden kullanilamaz", http.StatusBadRequest)
		return
	}
	if hata != "" {
		yazJSON(w, http.StatusOK, map[string]any{"tamam": false, "hata": hata})
		return
	}
	yazJSON(w, http.StatusOK, map[string]any{"tamam": true, "veri": cikti})
}

// pcDurumIslemYap: PC durum eklentisi bilgi/olcum isler; sonlandir yalnizca izin verilmisse calisir (izin sistemi kalici/bu sefer karari).
// Islem listesi sabittir. Eklenti kurulu ve etkin olmali.
func pcDurumIslemYap(profil, islem string, veri json.RawMessage) (json.RawMessage, string) {
	izinli := map[string]bool{"ozet": true, "anlik": true, "alanlar": true, "ozel": true, "izle-basla": true, "izle-dur": true, "surecler": true, "sonlandir": true}
	if !izinli[islem] {
		return nil, "bu işlem desteklenmiyor"
	}
	if !kuruluEtkinMiProfil(profil, "pc-durum") {
		return nil, "eklenti kurulu ya da etkin değil"
	}
	if izinAnahtar, gerekli := eklentiIslemIzni(profil, "pc-durum", islem); gerekli && !izinOkuProfil(profil).Acik(izinAnahtar) {
		// Otomatik kabul aciksa izin onaysiz hemen yazilir; degilse izin sistemi istenir.
		if !otomatikIzinVer(profil, izinAnahtar) {
			return nil, "IZIN_GEREKLI:" + izinAnahtar
		}
	}
	yol, err := kuruluEklentiYoluProfil(profil, "pc-durum")
	if err != nil {
		return nil, "eklenti dosyası bulunamadı"
	}
	cikti, err := eklentiCagirVarsayilan(eklentiCagri{Profil: profil, Anahtar: "pc-durum", Yol: yol, Islem: islem, Veri: veri, Ayar: kayitliAyarProfil(profil, "pc-durum")})
	if err != nil {
		return nil, "işlem başarısız"
	}
	if !cikti.Tamam {
		if cikti.Hata == "" {
			return nil, "işlem başarısız"
		}
		return nil, cikti.Hata
	}
	return cikti.Veri, ""
}

// everythingIslemYap: Everything eklentisine yalnizca arama yaptirir. Arama izni ve etkin eklenti gerekir.
func everythingIslemYap(profil, islem string, veri json.RawMessage) (json.RawMessage, string) {
	if islem != "ara" {
		return nil, "bu işlem desteklenmiyor"
	}
	if !izinOkuProfil(profil).Acik("everythingAra") || !kuruluEtkinMiProfil(profil, "everything") {
		return nil, "bu bilgisayarda arama kapalı"
	}
	yol, err := kuruluEklentiYoluProfil(profil, "everything")
	if err != nil {
		return nil, "eklenti dosyası bulunamadı"
	}
	cikti, err := eklentiCagirVarsayilan(eklentiCagri{Profil: profil, Anahtar: "everything", Yol: yol, Islem: "ara", Veri: veri, Ayar: kayitliAyarProfil(profil, "everything")})
	if err != nil {
		return nil, "arama başarısız"
	}
	if !cikti.Tamam {
		if cikti.Hata == "" {
			return nil, "arama başarısız"
		}
		return nil, cikti.Hata
	}
	if len(cikti.Veri) > 768*1024 {
		return nil, "sonuç çok büyük, daha kısa arayın"
	}
	return cikti.Veri, ""
}
