package utils

import (
	"database/sql"
	"strings"
	"time"
)

// ==================== ID Generation ====================
// GenerateID is available in id.go in this package

// ==================== Timestamp Helpers ======================================

// NowTimestamp returns the current time in database-friendly format
func NowTimestamp() string {
	return time.Now().Format("2006-01-02 15:04:05")
}

// ==================== Nullable Field Scanners ====================

// ScanNullStringValue safely extracts a string value from sql.NullString (empty if null)
func ScanNullStringValue(ns sql.NullString) string {
	if ns.Valid {
		return ns.String
	}
	return ""
}

// ==================== String Helpers =====================================

// StringPtr returns a pointer to a string (useful for optional fields)
func StringPtr(s string) *string {
	return &s
}

// ContainsString checks if a slice contains a string (case-sensitive)
func ContainsString(slice []string, item string) bool {
	for _, s := range slice {
		if s == item {
			return true
		}
	}
	return false
}

// GetSObjectString safely extracts a string value from an SObject map.
// Returns empty string if key doesn't exist, value is nil, or value is not a string.
func GetSObjectString(obj map[string]interface{}, key string) string {
	if v, ok := obj[key]; ok && v != nil {
		if s, ok := v.(string); ok {
			return s
		}
	}
	return ""
}

// ContainsStringIgnoreCase checks if a slice contains a string (case-insensitive)
// DESIGN ASSUMPTION: Object API names are case-insensitive for relationship matching.
// REST handlers often lowercase object names, but metadata stores original case.
// This function ensures robust matching regardless of case differences.
func ContainsStringIgnoreCase(slice []string, item string) bool {
	lowerItem := strings.ToLower(strings.TrimSpace(item))
	for _, s := range slice {
		if strings.ToLower(strings.TrimSpace(s)) == lowerItem {
			return true
		}
	}
	return false
}

