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 {
	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
	}
	var err error
	switch istek.Islem {
	case "etkinlestir":
		err = kuruluEtkinAyarla(istek.Anahtar, true)
		if err == nil {
			olayLog("eklenti etkinlestirildi: %s", istek.Anahtar)
		}
	case "devre-disi":
		err = kuruluEtkinAyarla(istek.Anahtar, false)
		if err == nil {
			olayLog("eklenti devre disi birakildi: %s (site yetkileri dusuruldu)", istek.Anahtar)
		}
	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 = eklentiKaldir(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})
}

// eklentiKaldir: kaydi siler, dosyalari siler, tum site yetkilerini dusurur.
func eklentiKaldir(anahtar string) error {
	// Calisan surec varsa once durdur; aksi halde plugin.exe kilitli kalir ve silinemez.
	_ = surecYonetici.Durdur(anahtar)
	if err := kuruluKaldir(anahtar); err != nil {
		return err
	}
	klasor, err := veriKlasoru()
	if err != nil {
		return err
	}
	if err := os.RemoveAll(filepath.Join(klasor, "eklentiler", anahtar)); err != nil {
		olayLog("eklenti dosyalari tam silinemedi: %s: %v", anahtar, err)
	}
	if err := yetkiGeriAl(anahtar, ""); err != nil {
		olayLog("eklenti yetkileri silinemedi: %s: %v", anahtar, err)
	}
	olayLog("eklenti kaldirildi: %s", anahtar)
	return nil
}
