package main

// Everything dosya aramasi artik bagimsiz bir eklentidir (fikoyt-eklenti-everything).
// Bu dosya yalnizca kurulu ve etkin eklentiyi cagirir; Everything'e dogrudan baglanmaz.
// Izin anahtari (everythingAra) ve site yetkisi yetkiKapisi tarafindan zaten denetlenir.

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

const everythingPaketAnahtari = "everything"

func everythingAraHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodGet {
		http.Error(w, "yalnizca GET", http.StatusMethodNotAllowed)
		return
	}
	sorgu := r.URL.Query().Get("search")
	if sorgu == "" {
		http.Error(w, "search parametresi gerekli", http.StatusBadRequest)
		return
	}
	if len(sorgu) > 200 {
		http.Error(w, "arama metni en fazla 200 karakter", http.StatusBadRequest)
		return
	}
	yol, err := kuruluEklentiYolu(everythingPaketAnahtari)
	if err != nil {
		http.Error(w, "Everything eklentisi kurulu degil", http.StatusServiceUnavailable)
		return
	}
	if !kuruluEtkinMi(everythingPaketAnahtari) {
		http.Error(w, "Everything eklentisi etkin degil", http.StatusForbidden)
		return
	}
	veri, err := json.Marshal(map[string]string{"sorgu": sorgu})
	if err != nil {
		http.Error(w, "istek hazirlanamadi", http.StatusInternalServerError)
		return
	}
	cikti, err := eklentiCagirVarsayilan(eklentiCagri{Anahtar: everythingPaketAnahtari, Yol: yol, Islem: "ara", Veri: veri})
	if err != nil || !cikti.Tamam {
		olayLog("everything eklentisi calismadi: %v", err)
		http.Error(w, "Everything aramasi basarisiz", http.StatusBadGateway)
		return
	}
	if eklentiParcaliMi(cikti.Veri) {
		// Parcali sonuc yalnizca sunucu (socket) yoluyla birlestirilir; bu yerel HTTP yolu kabul edemez.
		olayLog("everything sonucu cok buyuk (parcali), HTTP yolu kabul etmiyor")
		http.Error(w, "sonuc cok buyuk, daha kisa arayin", http.StatusBadGateway)
		return
	}
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.Header().Set("Cache-Control", "no-store")
	w.WriteHeader(http.StatusOK)
	_, _ = w.Write(cikti.Veri)
}
