package market

import (
	"fmt"
	"slices"
	"strings"
	"time"
)

// supportedTimeframes defines supported timeframes and their corresponding durations.
var supportedTimeframes = map[string]time.Duration{
	"1m":  time.Minute,
	"3m":  3 * time.Minute,
	"5m":  5 * time.Minute,
	"15m": 15 * time.Minute,
	"30m": 30 * time.Minute,
	"1h":  time.Hour,
	"2h":  2 * time.Hour,
	"4h":  4 * time.Hour,
	"6h":  6 * time.Hour,
	"12h": 12 * time.Hour,
	"1d":  24 * time.Hour,
}

// NormalizeTimeframe normalizes the incoming timeframe string (case-insensitive, no spaces), and validates if it's supported.
func NormalizeTimeframe(tf string) (string, error) {
	trimmed := strings.TrimSpace(strings.ToLower(tf))
	if trimmed == "" {
		return "", fmt.Errorf("timeframe cannot be empty")
	}
	if _, ok := supportedTimeframes[trimmed]; !ok {
		return "", fmt.Errorf("unsupported timeframe '%s'", tf)
	}
	return trimmed, nil
}

// TFDuration returns the time duration corresponding to the given timeframe.
func TFDuration(tf string) (time.Duration, error) {
	norm, err := NormalizeTimeframe(tf)
	if err != nil {
		return 0, err
	}
	return supportedTimeframes[norm], nil
}

// SupportedTimeframes returns all supported timeframes (sorted slice).
func SupportedTimeframes() []string {
	keys := make([]string, 0, len(supportedTimeframes))
	for k := range supportedTimeframes {
		keys = append(keys, k)
	}
	slices.Sort(keys)
	return keys
}
