package sslconfigs

import (
	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
	"strconv"
	"strings"
)

// HSTS设置
// 参考： https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
type HSTSConfig struct {
	IsOn              bool     `yaml:"isOn" json:"isOn"`
	MaxAge            int      `yaml:"maxAge" json:"maxAge"` // 单位秒
	IncludeSubDomains bool     `yaml:"includeSubDomains" json:"includeSubDomains"`
	Preload           bool     `yaml:"preload" json:"preload"`
	Domains           []string `yaml:"domains" json:"domains"`

	hasDomains  bool
	headerValue string
}

// 校验
func (this *HSTSConfig) Init() error {
	this.hasDomains = len(this.Domains) > 0
	this.headerValue = this.asHeaderValue()
	return nil
}

// 判断是否匹配域名
func (this *HSTSConfig) Match(domain string) bool {
	if !this.hasDomains {
		return true
	}
	return configutils.MatchDomains(this.Domains, domain)
}

// Header Key
func (this *HSTSConfig) HeaderKey() string {
	return "Strict-Transport-Security"
}

// 取得当前的Header值
func (this *HSTSConfig) HeaderValue() string {
	return this.headerValue
}

// 转换为Header值
func (this *HSTSConfig) asHeaderValue() string {
	b := strings.Builder{}
	b.WriteString("max-age=")
	if this.MaxAge > 0 {
		b.WriteString(strconv.Itoa(this.MaxAge))
	} else {
		b.WriteString("31536000") // 1 year
	}
	if this.IncludeSubDomains {
		b.WriteString("; includeSubDomains")
	}
	if this.Preload {
		b.WriteString("; preload")
	}
	return b.String()
}
