package fikoyt_json

import (
	"encoding/json"
	FikoYTMap "server/sistem/fikoyt_map"
	"strings"

	"github.com/gofiber/fiber/v3"
	"go.mongodb.org/mongo-driver/bson/primitive"
)

func AraIsleyici() fiber.Handler {
	return func(c fiber.Ctx) error {
		var jsonData FikoYTMap.FikoYTMap
		if err := json.Unmarshal([]byte(c.FormValue("req_body", "{}")), &jsonData); err != nil {
			return c.JSON(fiber.Map{"error": "Error unmarshalling JSON"})
		}

		c.Locals("json", convertStringToObjectId(jsonData))

		return c.Next() // Sonraki handler'ı çağır
	}
}

func convertStringToObjectId(v interface{}) interface{} {
	switch v := v.(type) {
	case string:
		// Check if the string is a valid ObjectId
		if len(v) == 24 && !strings.ContainsAny(v, " \t\n\r") {
			if rslt, err := primitive.ObjectIDFromHex(v); err == nil {
				// If it's a valid ObjectId string, convert it to primitive.ObjectID
				return rslt
			}
		}
		// If not a valid ObjectId string, return it as-is
		return v
	case map[string]interface{}:
		// If it's a map, recursively convert each value
		for k, val := range v {
			v[k] = convertStringToObjectId(val)
		}
		return v
	case []interface{}:
		// If it's a slice, recursively convert each element
		for i, val := range v {
			v[i] = convertStringToObjectId(val)
		}
		return v
	default:
		// Return the value as-is if it's not a string, map, or slice
		return v
	}
}
