package utils

import (
	"fmt"
	"regexp"
	"strconv"
	"strings"

	"github.com/tidbcloud/tiinf/errs"
)

const (
	timezoneRex = "^(\\+|-)(\\d{2}):(\\d{2})$"
)

func IsUserSetTimezoneValid(timezone string) error {
	matchString, err := regexp.MatchString(timezoneRex, timezone)
	if err != nil {
		return err
	}
	if !matchString {
		return errs.NewBadRequest(fmt.Sprintf("invalid timezone[%s]", timezone), nil)
	}

	compile := regexp.MustCompile(timezoneRex)
	submatch := compile.FindStringSubmatch(timezone)
	if len(submatch) != 4 {
		return errs.NewBadRequest(fmt.Sprintf("invalid timezone[%s]", timezone), nil)
	}

	h := submatch[2]
	hi, err := strconv.Atoi(h)
	if err != nil {
		return errs.NewBadRequest(fmt.Sprintf("invalid timezone[%s]", timezone), nil)
	}
	if hi < -12 || hi > 14 {
		return errs.NewBadRequest(fmt.Sprintf("invalid timezone[%s], hour should be an integer between -12 and 14", timezone), nil)
	}

	m := submatch[3]
	mi, err := strconv.Atoi(m)
	if err != nil {
		return errs.NewBadRequest(fmt.Sprintf("invalid timezone[%s]", timezone), nil)
	}
	if mi < 0 || mi >= 60 {
		return errs.NewBadRequest(fmt.Sprintf("invalid timezone[%s]", timezone), nil)
	}
	return nil
}

// conv +8 to +08:00
// conv -2 to -02:00

func ConvTimezone2NewTimezone(timezone string) string {
	if timezone == "" {
		return "+00:00"
	}
	if strings.Contains(timezone, ":") {
		return timezone
	}
	// 8 -2 -11
	var minus = false
	atoi, _ := strconv.Atoi(timezone)
	if atoi < 0 {
		minus = true
		atoi = -atoi
	}
	newTimezone := fmt.Sprintf("%d", atoi)
	if len(newTimezone) == 1 {
		newTimezone = fmt.Sprintf("0%s:00", newTimezone)
	} else {
		newTimezone = fmt.Sprintf("%s:00", newTimezone)
	}
	if minus {
		newTimezone = fmt.Sprintf("-%s", newTimezone)
	} else {
		newTimezone = fmt.Sprintf("+%s", newTimezone)
	}

	return newTimezone
}

func ConvTimezone2OldTimezone(timezone string) string {
	if timezone == "" {
		return "0"
	}
	if !strings.Contains(timezone, ":") {
		return timezone
	}
	split := strings.Split(timezone, ":")
	// +08 -05
	s := split[0]
	atoi, _ := strconv.Atoi(s)
	return fmt.Sprintf("%d", atoi)
}
