package cert

import (
	"time"

	"github.com/tidbcloud/infra-provider/regional-server/pkg/consts"
)

// DurationConfig overrides Certificate durations for environments whose PCA
// lifetime is shorter than the production defaults. Zero values keep defaults.
type DurationConfig struct {
	CertificateDuration time.Duration
	RenewBefore         time.Duration
}

func (c DurationConfig) withDefaults() DurationConfig {
	if c.CertificateDuration <= 0 {
		c.CertificateDuration = consts.CertificateDuration
	}
	if c.RenewBefore <= 0 {
		c.RenewBefore = consts.RenewBefore
	}
	return c
}

type options struct {
	duration DurationConfig
}

// Option configures generated cert-manager Certificate specs.
type Option func(*options)

// WithDurationConfig overrides the default Certificate duration and renewBefore.
func WithDurationConfig(duration DurationConfig) Option {
	return func(o *options) {
		o.duration = duration
	}
}

func resolveOptions(opts ...Option) options {
	o := options{
		duration: DurationConfig{}.withDefaults(),
	}
	for _, opt := range opts {
		opt(&o)
	}
	o.duration = o.duration.withDefaults()
	return o
}
