package urlutil

import (
	"fmt"
	"net/url"
	"strconv"
	"time"
)

// BuildTimeParameters adds the issued and expiry timestamps to the query parameters.
func BuildTimeParameters(params url.Values, expiry time.Duration) {
	now := time.Now()

	params.Set(QueryIssued, fmt.Sprint(now.UnixMilli()))
	params.Set(QueryExpiry, fmt.Sprint(now.Add(expiry).UnixMilli()))
}

// ValidateTimeParameters validates that the issued and expiry timestamps in the query parameters are valid.
func ValidateTimeParameters(params url.Values) error {
	now := time.Now()

	issuedMS, err := strconv.ParseInt(params.Get(QueryIssued), 10, 64)
	if err != nil {
		return fmt.Errorf("invalid issued timestamp: %w", err)
	}
	issued := time.UnixMilli(issuedMS)

	if now.Add(DefaultLeeway).Before(issued) {
		return ErrIssuedInTheFuture
	}

	expiryMS, err := strconv.ParseInt(params.Get(QueryExpiry), 10, 64)
	if err != nil {
		return fmt.Errorf("invalid expiry timestamp: %w", err)
	}
	expiry := time.UnixMilli(expiryMS)

	if now.Add(-DefaultLeeway).After(expiry) {
		return ErrExpired
	}

	return nil
}