package FikoYTCevap

import (
	"fmt"
	FikoYTCevapCls "server/sistem/fikoyt_ctx/fikoyt_cevap_cls"
	FikoYTHata "server/sistem/fikoyt_ctx/fikoyt_hata"
	"strings"

	"github.com/gofiber/fiber/v3"
)

func Ayarla(app *fiber.App) {
	app.Use(KureselAraIsleyici)
}

// Middleware: Tüm isteklere bakar, `fapi` ile başlıyorsa özel format uygular
func KureselAraIsleyici(c fiber.Ctx) error {
	// Eğer path `/fapi` ile başlamıyorsa, doğrudan devam et
	if c.Method() != fiber.MethodPost {
		return c.Next()
	}

	if c.Context().IsBodyStream() {
		return c.Next()
	}

	if !strings.HasPrefix(c.Path(), "/fapi") && !strings.HasPrefix(c.Path(), "/uyar") {
		return c.Next()
	}

	// Ana handler'ı çağır
	err := c.Next()
	if err != nil {
		fmt.Println("Hata Mevcut -->" + err.Error())
	}
	cevap := c.Locals("Cevap").(*FikoYTCevapCls.FikoYTCevap)

	// Ana handler'dan dönen yanıt ve durum kodu
	statusCode := c.Response().StatusCode()
	originalResponse := c.Response().Body()

	if cevap.Durum.Kodu == nil {
		cevap.Durum.Kodu = &statusCode
	}

	if err == nil {
		cevap.Durum.Tamamlandi = statusCode >= 200 && statusCode < 300

		cevap.Durum.Mesaj = map[bool]string{
			true:  FikoYTCevapCls.DurumMesajiAl(cevap.Durum.Kodu),
			false: cevap.Durum.Mesaj,
		}[cevap.Durum.Mesaj == ""]

		// cevap.Durum.Hata = false
		if len(cevap.Durum.Hatalar) > 0 {
			cevap.Durum.Hata = true

		}
		// if cevap.Durum.Hata == true {
		// 	fmt.Println("aaaaaaaaaaaaaaaa")
		// }

	} else {
		cevap.Durum.Tamamlandi = false
		cevap.Durum.Mesaj = err.Error()
		cevap.Durum.Hatalar.Ekle(FikoYTHata.YeniFikoYTHataKomutCalistirilirkenHata(c.Path(), nil).FikoYTHata)
		cevap.Durum.Hata = true
	}

	if cevap.Sonuc == nil {
		cevap.Sonuc = c.JSON(originalResponse)
	}
	// JSON yanıtını döndür
	return c.JSON(cevap)
}
