package main

// POST /eklenti/yerel: yalnizca bu bilgisayardaki ayar sayfasindan (CSRF + yerel Origin).
// Web bu ucu KULLANAMAZ. Kaldirma, PC'de onay ister.

import (
	"encoding/json"
	"errors"
	"net/http"
	"os"
	"path/filepath"
)

type yerelEklentiIstegi struct {
	Profil  string `json:"profil"`
	Anahtar string `json:"anahtar"`
	Islem   string `json:"islem"` // etkinlestir | devre-disi | kaldir
}

func yerelEklentiHandler(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 yerelEklentiIstegi
	if err := json.NewDecoder(http.MaxBytesReader(w, r.Body, 1024)).Decode(&istek); err != nil || !anahtarDesen.MatchString(istek.Anahtar) {
		http.Error(w, "gecersiz istek", http.StatusBadRequest)
		return
	}
	if !etkinMi(istek.Profil) {
		http.Error(w, "hesap etkin degil", http.StatusConflict)
		return
	}
	profil := istek.Profil
	var err error
	switch istek.Islem {
	case "etkinlestir":
		err = kuruluEtkinAyarlaProfil(profil, istek.Anahtar, true)
		if err == nil {
			olayLog("eklenti etkinlestirildi: %s [%s]", istek.Anahtar, profil)
		}
	case "devre-disi":
		err = kuruluEtkinAyarlaProfil(profil, istek.Anahtar, false)
		if err == nil {
			olayLog("eklenti devre disi birakildi: %s (site yetkileri dusuruldu) [%s]", istek.Anahtar, profil)
		}
	case "kaldir":
		onay, onayErr := onayBekle(
			"Eklenti kaldırılsın mı: "+istek.Anahtar,
			"Eklentinin dosyaları silinir ve tüm site yetkileri kaldırılır. Bu işlem geri alınamaz.",
		)
		if errors.Is(onayErr, errMesgul) {
			http.Error(w, "baska bir onay bekleniyor", http.StatusTooManyRequests)
			return
		}
		if onayErr != nil {
			http.Error(w, "onay ekrani acilamadi", http.StatusInternalServerError)
			return
		}
		if !onay {
			http.Error(w, "kullanici kaldirmayi reddetti", http.StatusForbidden)
			return
		}
		err = eklentiKaldirProfil(profil, istek.Anahtar)
	default:
		http.Error(w, "bilinmeyen islem", http.StatusBadRequest)
		return
	}
	if errors.Is(err, errKuruluYok) {
		http.Error(w, "eklenti kurulu degil", http.StatusNotFound)
		return
	}
	if err != nil {
		olayLog("eklenti islemi basarisiz: %s %s: %v", istek.Islem, istek.Anahtar, err)
		http.Error(w, "islem basarisiz", http.StatusInternalServerError)
		return
	}
	eklentiDurumGonder()
	yazJSON(w, http.StatusOK, map[string]any{"ok": true})
}

// eklentiKaldirProfil: verilen profilden kaydi siler ve o profilin site yetkilerini dusurur.
// Eklenti dosyalari makine genelindedir: baska bir profil hala kuruluysa dosyalar korunur.
func eklentiKaldirProfil(profil, anahtar string) error {
	// Calisan oturum varsa once durdur; aksi halde plugin.exe kilitli kalir ve silinemez.
	_ = ekEklentiDurdurProfil(profil, anahtar)
	if err := kuruluKaldirProfil(profil, anahtar); err != nil {
		return err
	}
	klasor, err := veriKlasoru()
	if err != nil {
		return err
	}
	if !eklentiDosyalariSilinsinMi(anahtar) {
		olayLog("eklenti dosyalari baska bir profilde kullanildigi icin korundu: %s", anahtar)
	} else if err := os.RemoveAll(filepath.Join(klasor, "eklentiler", anahtar)); err != nil {
		olayLog("eklenti dosyalari tam silinemedi: %s: %v", anahtar, err)
	}
	if err := yetkiGeriAlProfil(profil, anahtar, ""); err != nil {
		olayLog("eklenti yetkileri silinemedi: %s: %v", anahtar, err)
	}
	olayLog("eklenti kaldirildi: %s", anahtar)
	return nil
}
