package internal

import (
	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/util/gconv"
	"regexp"
	"strings"
	"time"
)

// 单位与字节的换算关系（1单位 = 多少字节）
var unitMap = map[string]int64{
	"b":  1,       // 字节
	"kb": 1 << 10, // 1KB = 1024B
	"mb": 1 << 20, // 1MB = 1024KB
	"gb": 1 << 30, // 1GB = 1024MB
	"tb": 1 << 40, // 1TB = 1024GB
}

// 单位与秒的换算（1单位 = 多少秒）
var durationMap = map[string]int64{
	"s": 1,
	"m": 60,
	"h": 3600,
	"d": 86400,
}

// parseSize 将带单位的大小字符串（如"100kb"、"2MB"）转换为字节数
func parseSize(sizeStr string) (int64, error) {
	if sizeStr == "" {
		return 0, gerror.New("空的大小配置")
	}

	// 正则匹配：提取数字和单位（支持整数/小数，如"1.5mb"）
	re := regexp.MustCompile(`^(\d+(\.\d+)?)([a-zA-Zb]+)$`)
	matches := re.FindStringSubmatch(strings.TrimSpace(sizeStr))
	if len(matches) != 4 {
		return 0, gerror.New("无效的大小格式（示例：100kb、2mb、1g）")
	}

	// 提取数值和单位
	valueStr := matches[1]
	unit := strings.ToLower(matches[3]) // 单位转为小写（统一处理）

	// 转换数值为float64

	value := gconv.Float64(valueStr)
	// 查找单位对应的字节数
	unitBytes, ok := unitMap[unit]
	if !ok {
		return 0, gerror.Newf("不支持的单位:{%+v}（支持：b、kb、mb、gb、tb）", unit)
	}

	// 计算总字节数（数值 * 单位字节数）
	return int64(value * float64(unitBytes)), nil
}

// parseDuration 将带单位的时间字符串（如"30s"、"5m"）转换为time.Duration
func parseDuration(intervalStr string) (time.Duration, error) {
	if intervalStr == "" {
		return 30 * time.Second, nil // 默认30秒
	}

	re := regexp.MustCompile(`^(\d+)([smhd])$`) // 匹配数字+单位（s/m/h/d）
	matches := re.FindStringSubmatch(strings.TrimSpace(intervalStr))
	if len(matches) != 3 {
		return 0, gerror.New("无效的时间格式（示例：30s、5m、1h）")
	}

	num := gconv.Int(matches[1])
	unit := matches[2]
	sec, ok := durationMap[unit]
	if !ok {
		return 0, gerror.New("不支持的单位（仅支持s/m/h/d）")
	}

	return time.Duration(num) * time.Duration(sec) * time.Second, nil
}
