package FikoYTMap

import (
	"reflect"

	"github.com/gofiber/fiber/v3"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
)

type FikoYTMap fiber.Map

func (f FikoYTMap) BosAlanlar() []string {
	var bosAlanlar []string

	for key, value := range f {
		if value == nil {
			// fmt.Printf("Alan boş veya nil: %s\n", key)
			bosAlanlar = append(bosAlanlar, key)
		}
		v := reflect.ValueOf(value)
		if v.Kind() == reflect.String && v.Len() == 0 {
			// fmt.Printf("Alan boş string: %s\n", key)
			bosAlanlar = append(bosAlanlar, key)
		}
		if v.Kind() == reflect.Bool && !v.Bool() {
			// fmt.Printf("Alan boş string: %s\n", key)
			bosAlanlar = append(bosAlanlar, key)
		}
	}
	return bosAlanlar
}

func (f FikoYTMap) TumAlanlarDolumu() bool {
	for _, value := range f {
		if value == nil {
			// fmt.Printf("Alan boş veya nil: %s\n", key)
			return false
		}
		v := reflect.ValueOf(value)
		if v.Kind() == reflect.String && v.Len() == 0 {
			// fmt.Printf("Alan boş string: %s\n", key)
			return false
		}
		if v.Kind() == reflect.Bool && !v.Bool() {
			// fmt.Printf("Alan boş string: %s\n", key)
			return false
		}
	}
	return true
}

func (f FikoYTMap) IsleObjectId() FikoYTMap {
	for key, value := range f {
		// Check if the value is a string and if it's a valid ObjectId format
		if strVal, ok := value.(string); ok {
			if len(strVal) == 24 { // MongoDB ObjectId is 24 characters long
				if objectId, err := primitive.ObjectIDFromHex(strVal); err == nil {
					// If it's a valid ObjectId, replace the value with ObjectId
					f[key] = objectId
				}
			}
		}
	}
	return f
}

func toBsonM(f FikoYTMap) bson.M {
	result := bson.M{}
	for k, v := range f {
		switch val := v.(type) {
		case map[string]interface{}:
			result[k] = toBsonM(val) // recursive dönüşüm
		case []interface{}:
			result[k] = convertSlice(val)
		default:
			result[k] = val
		}
	}
	return result
}

func convertSlice(arr []interface{}) []interface{} {
	for i, v := range arr {
		switch elem := v.(type) {
		case map[string]interface{}:
			arr[i] = toBsonM(elem)
		case []interface{}:
			arr[i] = convertSlice(elem) // nested array
		}
	}
	return arr
}
