package config

import (
	"time"

	sdkconfig "github.com/tidbcloud/aisupport/packages/sdk-go/infra/config"
)

type RootConfig struct {
	Log sdkconfig.Loggers `yaml:"log"`

	Secret SecretConfig `yaml:"secret"`

	Database sdkconfig.Database `yaml:"database"`
	Asset    AssetConfig        `yaml:"asset"`

	Clients  ClientsConfig  `yaml:"clients"`
	Services ServicesConfig `yaml:"services"`

	RPCServer        RPCServerConfig        `yaml:"rpcServer"`
	RPCGatewayServer RPCGatewayServerConfig `yaml:"rpcGatewayServer"`
}

type SecretConfig struct {
	sdkconfig.Secret `yaml:",inline"`

	RootConfigSecretName string `yaml:"rootConfigSecretName"`
}

type AssetConfig struct {
	BucketName string `yaml:"bucketName" validate:"required"`
}

type RPCServerConfig struct {
	Address string `yaml:"address" default:":9090"`
}

type RPCGatewayServerConfig struct {
	Address    string `yaml:"address" default:":8080"`
	RPCAddress string `yaml:"rpcAddress" default:":9090"`
}

type ClientsConfig struct {
	Lark sdkconfig.LarkClient `yaml:"lark"`
	GCP  GCPClientConfig      `yaml:"gcp"`
}

type GCPClientConfig struct {
	Cred string `yaml:"cred" validate:"required"`
}

type ServicesConfig struct {
	User     UserServiceConfig     `yaml:"user"`
	IAM      IAMServiceConfig      `yaml:"iam"`
	Auth     AuthServiceConfig     `yaml:"auth"`
	Calendar CalendarServiceConfig `yaml:"calendar"`
}

type CalendarServiceConfig struct {
	MaxQueryDays int                       `yaml:"maxQueryDays" default:"366" validate:"gt=0"`
	FileCleanup  CalendarFileCleanupConfig `yaml:"fileCleanup"`
}

type CalendarFileCleanupConfig struct {
	CronDisable bool          `yaml:"cronDisable" default:"false"`
	CronSpec    string        `yaml:"cronSpec" default:"0 3 * * *" validate:"required_if=CronDisable false"`
	MinAge      time.Duration `yaml:"minAge" default:"24h" validate:"gt=0"`
}

type AuthServiceConfig struct {
	// Deprecated: use Providers for new deployments. Kept for single-provider compatibility.
	AuthDomain     string               `yaml:"authDomain"`
	AuthAudience   string               `yaml:"authAudience"`
	UserEmailClaim string               `yaml:"userEmailClaim" default:"email"`
	Providers      []AuthProviderConfig `yaml:"providers" validate:"dive"`
}

type AuthProviderConfig struct {
	Name           string `yaml:"name"`
	AuthDomain     string `yaml:"authDomain" validate:"required"`
	AuthAudience   string `yaml:"authAudience" validate:"required"`
	UserEmailClaim string `yaml:"userEmailClaim" default:"email"`
}

type UserServiceConfig struct {
	ExpireAPITokenInterval time.Duration   `yaml:"expireAPITokenInterval" default:"1h"`
	SyncUser               SyncUserConfig  `yaml:"syncUser"`
	SyncGroup              SyncGroupConfig `yaml:"syncGroup"`
}

type SyncUserConfig struct {
	CronDisable bool   `yaml:"cronDisable" default:"false"`
	CronSpec    string `yaml:"cronSpec" validate:"required_if=CronDisable false" default:"0 8 * * *"`
}

type SyncGroupConfig struct {
	CronDisable bool   `yaml:"cronDisable" default:"false"`
	CronSpec    string `yaml:"cronSpec" validate:"required_if=CronDisable false" default:"30 8 * * *"`
}

type IAMServiceConfig struct {
	SyncRoleBindingsForGroup IAMSyncRoleBindingsForGroupConfig `yaml:"syncRoleBindingsForGroup"`
}

type IAMSyncRoleBindingsForGroupConfig struct {
	CronDisable           bool                `yaml:"cronDisable" default:"false"`
	CronSpec              string              `yaml:"cronSpec" validate:"required_if=CronDisable false" default:"0 0 * * *"`
	LarkDepartmentToRoles map[string][]string `yaml:"larkDepartmentToRoles"`
}
