package main

// POST /eklenti/yerel-ayar: eklenti ayarini yalnizca bu bilgisayardaki ayar sayfasindan kaydeder
// (CSRF + yerel Origin). Web bu ucu kullanamaz. Yalnizca semada tanimli alanlar kabul edilir.

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

type yerelAyarIstegi struct {
	Profil  string         `json:"profil"`
	Anahtar string         `json:"anahtar"`
	Ayar    map[string]any `json:"ayar"`
}

func yerelEklentiAyarHandler(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
	}
	var istek yerelAyarIstegi
	if err := json.NewDecoder(http.MaxBytesReader(w, r.Body, 16*1024)).Decode(&istek); err != nil ||
		!anahtarDesen.MatchString(istek.Anahtar) || !profilAnahtarDesen.MatchString(istek.Profil) {
		http.Error(w, "gecersiz istek", http.StatusBadRequest)
		return
	}
	if !etkinMi(istek.Profil) {
		http.Error(w, "hesap etkin degil", http.StatusConflict)
		return
	}
	if !kuruluVarMiProfil(istek.Profil, istek.Anahtar) {
		http.Error(w, "eklenti kurulu degil", http.StatusNotFound)
		return
	}
	alanlar := ayarAlanlari(istek.Anahtar)
	if len(alanlar) == 0 {
		http.Error(w, "bu eklentinin ayari yok", http.StatusBadRequest)
		return
	}
	temiz := map[string]any{}
	for _, a := range alanlar {
		v, varMi := istek.Ayar[a.Ad]
		if !varMi {
			continue
		}
		if a.Tur == ayarParola {
			if s, _ := v.(string); s == "" {
				continue // bos parola: mevcut parola korunur
			}
		}
		temiz[a.Ad] = v
	}
	ham, err := json.Marshal(temiz)
	if err != nil {
		http.Error(w, "gecersiz ayar", http.StatusBadRequest)
		return
	}
	birlesik, err := ayarBirlestir(istek.Profil, istek.Anahtar, ham)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}
	if err := ayarKaydet(istek.Profil, istek.Anahtar, birlesik); err != nil {
		http.Error(w, "ayar kaydedilemedi", http.StatusInternalServerError)
		return
	}
	if ekSurecCalisiyorProfil(istek.Profil, istek.Anahtar) {
		_ = ekSurecAyarProfil(istek.Profil, istek.Anahtar, birlesik)
	}
	eklentiDurumGonderProfil(istek.Profil)
	olayLog("eklenti ayari kaydedildi (yerel): %s [%s]", istek.Anahtar, istek.Profil)
	yazJSON(w, http.StatusOK, map[string]any{"ok": true})
}
