package fikoyt_json

import (
	"encoding/json"
	"fmt"
	FikoYTMap "server/sistem/fikoyt_map"

	"github.com/gofiber/fiber/v3"
)

func AraIsleyici() fiber.Handler {
	return func(c fiber.Ctx) error {
		var raw interface{}
		var err error

		// Debug: gelen body'yi logla
		fmt.Println("Gelen Body:", string(c.Body()))

		// Öncelik req_body parametresinde, yoksa gövdeyi kullan
		input := []byte(c.FormValue("req_body"))
		if len(input) == 0 {
			input = c.BodyRaw() // or c.Body()
		}

		// Boş içerik varsa json'a nil ata
		if len(input) == 0 {
			c.Locals("json", nil)
			return c.Next()
		}

		// JSON parse etmeye çalış
		err = json.Unmarshal(input, &raw)
		if err != nil {
			fmt.Println("JSON Parse Hatası:", err)
			c.Locals("json", nil)
			return c.Next()
		}

		// Tip kontrolü yap
		switch val := raw.(type) {
		case map[string]interface{}:
			c.Locals("json", FikoYTMap.FikoYTMap(val))

		case []interface{}:
			allMaps := true
			for _, item := range val {
				if _, ok := item.(map[string]interface{}); !ok {
					allMaps = false
					break
				}
			}

			if allMaps {
				var list []FikoYTMap.FikoYTMap
				for _, item := range val {
					m := item.(map[string]interface{})
					list = append(list, FikoYTMap.FikoYTMap(m))
				}
				c.Locals("json", list)
			} else {
				// Liste ama map olmayan elemanlar var → direkt gönder
				c.Locals("json", val)
			}

		default:
			// Ne map ne de listeyse direkt yolla
			c.Locals("json", val)
		}

		return c.Next()
	}
}
