package validators

import (
	"net/netip"
	"regexp"

	validation "github.com/go-ozzo/ozzo-validation/v4"
)

// IsRegex checks whether the validated value is a valid regular expression pattern.
//
// Example:
//
//	validation.Field(&form.Pattern, validation.By(validators.IsRegex))
func IsRegex(value any) error {
	v, ok := value.(string)
	if !ok {
		return ErrUnsupportedValueType
	}

	if v == "" {
		return nil // nothing to check
	}

	if _, err := regexp.Compile(v); err != nil {
		return validation.NewError("validation_invalid_regex", err.Error())
	}

	return nil
}

// IPOrSubnet checks whether the validated value is an individual
// IPv4/IPv6 or CIDR subnet.
func IPOrSubnet(value any) error {
	v, ok := value.(string)
	if !ok {
		return ErrUnsupportedValueType
	}

	if v == "" {
		return nil // nothing to check
	}

	// subnet
	_, err := netip.ParsePrefix(v)
	if err == nil {
		return nil
	}

	// individual IP
	_, err = netip.ParseAddr(v)
	if err == nil {
		return nil
	}

	return validation.NewError("validation_invlaid_ip_or_subnet", "invalid IP or CIDR subnet")
}
