package swagger

import (
	"strconv"

	"go-doc/internal/util"
)

func getBoolFromKVOrDefault(properties map[string]string, key string, def bool) bool {
	if len(properties) == 0 {
		return def
	}
	val, ok := properties[key]
	if !ok || len(val) == 0 {
		return def
	}
	//I think this function and those below should handle error, but they didn't.
	//Since a default value (def) is provided, any parsing errors will result in the default being returned.
	// Try to unquote if the value is quoted, otherwise use as-is
	str := val
	if unquoted, err := strconv.Unquote(val); err == nil {
		str = unquoted
	}
	if len(str) == 0 {
		return def
	}
	res, _ := strconv.ParseBool(str)
	return res
}

func getStringFromKVOrDefault(properties map[string]string, key string, def string) string {
	if len(properties) == 0 {
		return def
	}
	val, ok := properties[key]
	if !ok || len(val) == 0 {
		return def
	}
	// Try to unquote if the value is quoted, otherwise use as-is
	str := val
	if unquoted, err := strconv.Unquote(val); err == nil {
		str = unquoted
	}
	return str
}

func getListFromInfoOrDefault(properties map[string]string, key string, def []string) []string {
	if len(properties) == 0 {
		return def
	}
	val, ok := properties[key]
	if !ok || len(val) == 0 {
		return def
	}

	// Try to unquote if the value is quoted, otherwise use as-is
	str := val
	if unquoted, err := strconv.Unquote(val); err == nil {
		str = unquoted
	}
	resp := util.FieldsAndTrimSpace(str, commaRune)
	if len(resp) == 0 {
		return def
	}
	return resp
}

func getFirstUsableString(def ...string) string {
	if len(def) == 0 {
		return ""
	}
	for _, val := range def {
		str, err := strconv.Unquote(val)
		if err == nil && len(str) != 0 {
			return str
		}
	}
	return ""
}
