package hooks

import (
	"encoding/json"
	"net/http"
	"reflect"
)

func SliceTypeStringDecode[T any](from, to reflect.Value) (any, error) {
	into := make([]T, 0)
	return complexTypeStringDecodeHook(from, to, into)
}

func MapTypeStringDecode[K ~string | ~int, V any](from, to reflect.Value) (any, error) {
	into := make(map[K]V, 0)
	return complexTypeStringDecodeHook(from, to, into)
}

func MapHTTPHeaderStringDecode(from, to reflect.Value) (any, error) {
	into := http.Header{}
	return complexTypeStringDecodeHook(from, to, into)
}

func complexTypeStringDecodeHook(from, to reflect.Value, out any) (any, error) {
	fromInterface := from.Interface()
	if to.Type() != reflect.TypeOf(out) {
		return fromInterface, nil
	}
	data, ok := fromInterface.(string)
	if !ok {
		return fromInterface, nil
	}
	err := json.Unmarshal([]byte(data), &out)
	return out, err
}