package systemconfigs

import (
	"github.com/iwind/TeaGo/types"
	timeutil "github.com/iwind/TeaGo/utils/time"
	"time"
)

// UserUIConfig 用户界面相关配置
type UserUIConfig struct {
	ProductName    string `json:"productName"`    // 产品名
	UserSystemName string `json:"userSystemName"` // 管理员系统名称
	ShowPageFooter bool   `json:"showPageFooter"` // 是否显示页脚
	PageFooterHTML string `json:"pageFooterHTML"` // 页脚HTML
	ShowVersion    bool   `json:"showVersion"`    // 是否显示版本号
	Version        string `json:"version"`        // 显示的版本号
	ShowFinance    bool   `json:"showFinance"`    // 是否显示财务相关信息
	FaviconFileId  int64  `json:"faviconFileId"`  // Favicon文件ID
	LogoFileId     int64  `json:"logoFileId"`     // 控制面板Logo文件ID

	TimeZone string `json:"timeZone"` // 时区

	DNSResolver struct {
		Type string `json:"type"` // 类型，参考 DNSResolverType*
	} `json:"dnsResolver"` // DNS解析设置

	ClientIPHeaderNames string `json:"clientIPHeaderNames"` // 客户端IP获取报头名称列表

	Server struct {
		CheckCNAME bool `json:"checkCNAME"` // 是否检查CNAME
	} `json:"server"` // 服务相关设置

	BandwidthUnit                BandwidthUnit `json:"bandwidthUnit"`                // 带宽单位
	ShowTrafficCharts            bool          `json:"showTrafficCharts"`            // 是否显示流量相关图表和数据
	ShowCacheInfoInTrafficCharts bool          `json:"showCacheInfoInTrafficCharts"` // 在流量图中显示缓存相关信息
	ShowBandwidthCharts          bool          `json:"showBandwidthCharts"`          // 是否显示带宽相关图表和数据

	TrafficStats struct {
		BandwidthPercentile       int32         `json:"bandwidthPercentile"`       // 带宽百分位
		DefaultBandwidthDateRange string        `json:"defaultBandwidthDateRange"` // 默认带宽周期
		BandwidthAlgo             BandwidthAlgo `json:"bandwidthAlgo"`             // 带宽算法
	} `json:"trafficStats"` // 流量统计相关设置

	Portal struct {
		IsOn       bool  `json:"isOn"`       // 是否启用
		LogoFileId int64 `json:"logoFileId"` // Logo文件ID
	} `json:"portal"` // 门户页面相关设置

	Theme ThemeConfig `yaml:"theme" json:"theme"` // 风格模板
}

func NewUserUIConfig() *UserUIConfig {
	var config = &UserUIConfig{
		ProductName:         "GoEdge",
		UserSystemName:      "GoEdge用户系统",
		ShowPageFooter:      false,
		ShowVersion:         true,
		ShowFinance:         true,
		BandwidthUnit:       BandwidthUnitBit,
		ShowBandwidthCharts: true,
		ShowTrafficCharts:   true,
		TimeZone:            "Asia/Shanghai",
	}

	// DNS解析设置
	config.DNSResolver.Type = "default"

	// 服务相关
	config.Server.CheckCNAME = true

	// 流量相关
	config.TrafficStats.BandwidthPercentile = 95
	config.TrafficStats.DefaultBandwidthDateRange = "latest30days"
	return config
}

type BandwidthDateRange struct {
	Name    string `json:"name"`
	Code    string `json:"code"`
	DayFrom string `json:"dayFrom"`
	DayTo   string `json:"dayTo"`
}

const DefaultBandwidthDateRangeCode = "latest30days"
const DefaultBandwidthPercentile int32 = 95

func FindAllBandwidthDateRanges() []*BandwidthDateRange {
	var dayInWeek = types.Int(timeutil.Format("w"))
	if dayInWeek == 0 {
		dayInWeek = 7
	}

	return []*BandwidthDateRange{
		{
			Name:    "今天",
			Code:    "today",
			DayFrom: timeutil.Format("Y-m-d"),
			DayTo:   timeutil.Format("Y-m-d"),
		},
		{
			Name:    "昨天",
			Code:    "yesterday",
			DayFrom: timeutil.Format("Y-m-d", time.Now().AddDate(0, 0, -1)),
			DayTo:   timeutil.Format("Y-m-d", time.Now().AddDate(0, 0, -1)),
		},
		{
			Name:    "近7天",
			Code:    "latest7days",
			DayFrom: timeutil.Format("Y-m-d", time.Now().AddDate(0, 0, -6)),
			DayTo:   timeutil.Format("Y-m-d"),
		},
		{
			Name:    "上周",
			Code:    "lastWeek",
			DayFrom: timeutil.Format("Y-m-d", time.Now().AddDate(0, 0, -dayInWeek-6)),
			DayTo:   timeutil.Format("Y-m-d", time.Now().AddDate(0, 0, -dayInWeek)),
		},
		{
			Name:    "近30天",
			Code:    "latest30days",
			DayFrom: timeutil.Format("Y-m-d", time.Now().AddDate(0, 0, -29)),
			DayTo:   timeutil.Format("Y-m-d"),
		},
		{
			Name:    "当月",
			Code:    "currentMonth",
			DayFrom: timeutil.Format("Y-m-01"),
			DayTo:   timeutil.Format("Y-m-d"),
		},
		{
			Name:    "上月",
			Code:    "lastMonth",
			DayFrom: timeutil.Format("Y-m-01", time.Now().AddDate(0, -1, 0)),
			DayTo:   timeutil.Format("Y-m-t", time.Now().AddDate(0, -1, 0)),
		},
	}
}

func FindBandwidthDateRange(code string) *BandwidthDateRange {
	for _, r := range FindAllBandwidthDateRanges() {
		if r.Code == code {
			return r
		}
	}
	return nil
}
