package cert

import "time"

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

func (c DurationConfig) withDefaults() DurationConfig {
	if c.TiDBServerDuration <= 0 {
		c.TiDBServerDuration = tidbServerCertificateDuration
	}
	if c.TiProxyServerDuration <= 0 {
		c.TiProxyServerDuration = tiProxyServerCertificateDuration
	}
	if c.RenewBefore <= 0 {
		c.RenewBefore = renewBefore
	}
	return c
}

type options struct {
	duration DurationConfig
}

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

// WithDurationConfig overrides the default TiDB/TiProxy server certificate
// durations and renewBefore values.
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
}
