package main

import (
	// External
	werr "git.ahall.se/go/wrappederror"

	// Standard
	"regexp"
	"strconv"
	"time"
)

var rxpTimezone *regexp.Regexp

func init() {
	rxpTimezone = regexp.MustCompile(`(\d\d)(\d\d)$`)
}

func stringToTime(strTime string) (t time.Time, err error) { // {{{
	// `date` command %z gives timezone like +0200 instead of +02:00.
	// This can easily be fixed here, not requiring all scripts to be fixed.
	t, err = time.Parse(time.RFC3339, strTime)
	if err != nil {
		// Check for aforementioned problem.
		parseError, ok := err.(*time.ParseError)
		if ok && parseError != nil && parseError.LayoutElem == "Z07:00" {
			// Insert the missing colon according to RFC 3339 and try again.
			patchedTimeStr := rxpTimezone.ReplaceAllString(strTime, `$1:$2`)
			t, err = time.Parse(time.RFC3339, patchedTimeStr)
		}

		// Couldn't convert to time.ParseError or the retry
		// failed. Either way, an error occurs.
		if err != nil {
			err = werr.Wrap(err).WithData(strTime)
			return
		}
	}

	return
} // }}}
func parseHTMLDateTime(str string, dflt time.Time) (t time.Time, err error) { // {{{
	// Browser sending 2024-06-27T10:43 (16 characters) when seconds is 00.
	if len(str) == 16 {
		str += ":00"
	}
	if str == "" {
		return dflt, nil
	} else {
		t, err = time.ParseInLocation("2006-01-02T15:04:05", str, smonConfig.Timezone())
		if err != nil {
			err = werr.Wrap(err)
		}
	}
	return
} // }}}

func applyTimeOffset(t time.Time, duration time.Duration, amountStr string) time.Time { // {{{
	amount, err := strconv.Atoi(amountStr)
	if err != nil {
		return t
	}

	return t.Add(duration * time.Duration(amount))
} // }}}
func presetTimeInterval(duration time.Duration, presetStr string, timeFrom, timeTo *time.Time) () {// {{{
	if presetStr == "" {
		return
	}

	now := time.Now()
	presetTime, _ := strconv.Atoi(presetStr)
	(*timeFrom) = now.Add(duration * -1 * time.Duration(presetTime))
	(*timeTo) = now
	return
}// }}}
