package httputil

import (
	"regexp"
	"strings"
)

// CID validation regex - basic IPFS CID pattern (v0 and v1)
// v0: Qm... (base58, 46 characters)
// v1: b... or z... (base32/base58, variable length)
var cidRegex = regexp.MustCompile(`^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[a-z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,})$`)

// ValidateCID checks if a string is a valid IPFS CID.
func ValidateCID(cid string) bool {
	return cidRegex.MatchString(strings.TrimSpace(cid))
}

// ValidateNamespace checks if a namespace name is valid.
// Valid namespaces must:
// - Not be empty after trimming
// - Only contain alphanumeric characters, hyphens, and underscores
// - Start with a letter or number
// - Be between 1 and 64 characters
var namespaceRegex = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$`)

func ValidateNamespace(ns string) bool {
	ns = strings.TrimSpace(ns)
	if ns == "" {
		return false
	}
	return namespaceRegex.MatchString(ns)
}

// ValidateTopicName checks if a pubsub topic name is valid.
// Valid topics must:
// - Not be empty after trimming
// - Only contain alphanumeric characters, hyphens, underscores, slashes, and dots
// - Be between 1 and 256 characters
var topicRegex = regexp.MustCompile(`^[a-zA-Z0-9._/-]{1,256}$`)

func ValidateTopicName(topic string) bool {
	topic = strings.TrimSpace(topic)
	if topic == "" {
		return false
	}
	return topicRegex.MatchString(topic)
}

// ValidateWalletAddress checks if a string looks like a valid wallet address.
// Supports Ethereum (40 hex chars, optional "0x" prefix) and Solana (32-44 base58 chars).
var ethWalletRegex = regexp.MustCompile(`^(0x)?[0-9a-fA-F]{40}$`)
var solanaWalletRegex = regexp.MustCompile(`^[1-9A-HJ-NP-Za-km-z]{32,44}$`)

func ValidateWalletAddress(wallet string) bool {
	wallet = strings.TrimSpace(wallet)
	return ethWalletRegex.MatchString(wallet) || solanaWalletRegex.MatchString(wallet)
}

// NormalizeWalletAddress normalizes a wallet address by removing "0x" prefix and converting to lowercase.
func NormalizeWalletAddress(wallet string) string {
	wallet = strings.TrimSpace(wallet)
	wallet = strings.TrimPrefix(wallet, "0x")
	wallet = strings.TrimPrefix(wallet, "0X")
	return strings.ToLower(wallet)
}

// IsEmpty checks if a string is empty after trimming whitespace.
func IsEmpty(s string) bool {
	return strings.TrimSpace(s) == ""
}

// IsNotEmpty checks if a string is not empty after trimming whitespace.
func IsNotEmpty(s string) bool {
	return strings.TrimSpace(s) != ""
}

// ValidateDMapName checks if a distributed map name is valid.
// Valid dmap names must:
// - Not be empty after trimming
// - Only contain alphanumeric characters, hyphens, underscores, and dots
// - Be between 1 and 128 characters
var dmapRegex = regexp.MustCompile(`^[a-zA-Z0-9._-]{1,128}$`)

func ValidateDMapName(dmap string) bool {
	dmap = strings.TrimSpace(dmap)
	if dmap == "" {
		return false
	}
	return dmapRegex.MatchString(dmap)
}
