package config

type Clients struct {
	Lark           LarkConfig           `yaml:"lark"`
	AWS            AWSClientConfig      `yaml:"aws"`
	GCP            GCPClientConfig      `yaml:"gcp"`
	Aliyun         AliyunClientConfig   `yaml:"aliyun"`
	FAD            FADConfig            `yaml:"fad"`
	SendGrid       SendGrid             `yaml:"sendgrid"`
	Jira           JiraConfig           `yaml:"jira"`
	EEServer       EEServerConfig       `yaml:"eeServer"`
	Github         GithubConfig         `yaml:"github"`
	Authing        AuthingConfig        `yaml:"authing"`
	Ones           OnesClientConfig     `yaml:"ones"`
	InfraAPIServer InfraAPIServerConfig `yaml:"infraAPIServer"`
	LLM            LLMConfig            `yaml:"llm"`
	ClinicServer   ClinicServer         `yaml:"clinicServer"`
	AIOpsServer    AIOpsServerConfig    `yaml:"aiopsServer"`
	AccountServer  AccountServer        `yaml:"accountServer"`
	GithubAction   GithubActionConfig   `yaml:"githubAction"`
	OnCall         OnCallConfig         `yaml:"oncall"`
}

type LarkConfig struct {
	// Global is the certificate for the global lark bot.
	Global LarkCertConfig `yaml:"global"`
	// CardEventProxyKey is the key in card values and the value of it is used
	// to proxy the lark event.
	CardEventProxyKey string `yaml:"cardEventProxyKey" `
	// ProxyAddrs proxy the lark event based on the environment.
	//
	// We use the same lark app in different environments, so we need to proxy the event
	// to the corresponding environment.
	CardEventProxyAddrs map[string]string `yaml:"cardEventProxyAddrs"`
}

type AWSClientConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`
}

type GCPClientConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`
	// SecretName is the secret name in AWS Secret Manager.
	// If it is nil, won't read secrets from AWS Secret Manager.
	SecretName *string `yaml:"secretName"`
	// Region is the default region.
	Region    string `yaml:"region" default:"us-west-2"`
	ProjectID string `yaml:"projectID" validate:"required_if=Dummy false"`
}

type AliyunClientConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`
}

type AuthingConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`

	ManagementAccessKey string `yaml:"managementAccessKey" validate:"required_if=Dummy false"` // READ FROM ASM
	ManagementSecretKey string `yaml:"managementSecretKey" validate:"required_if=Dummy false"` // READ FROM ASM
}

type OnesClientConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`

	Domain string `yaml:"domain" validate:"required_if=Dummy false"`
	TeamID string `yaml:"teamID" validate:"required_if=Dummy false"`
	Token  string `yaml:"token" validate:"required_if=Dummy false"` // READ FROM ASM
}

type GithubConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`

	Token string `yaml:"token" validate:"required_if=Dummy false"` // READ FROM ASM
}

type JiraConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`

	JiraURL                 string `yaml:"jiraURL" validate:"required_if=Dummy false"`
	JiraUsername            string `yaml:"jiraUsername" validate:"required_if=Dummy false"`
	JiraPassword            string `yaml:"jiraPassword" validate:"required_if=Dummy false"`            // READ FROM ASM
	LarkGroupPluginQueryURL string `yaml:"larkGroupPluginQueryURL" validate:"required_if=Dummy false"` // READ FROM ASM
	LarkGroupPluginBindURL  string `yaml:"larkGroupPluginBindURL" validate:"required_if=Dummy false"`  // READ FROM ASM
}

type EEServerConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`

	Addr     string `yaml:"addr" validate:"required_if=Dummy false"`
	User     string `yaml:"user" validate:"required_if=Dummy false"`     // READ FROM ASM
	Password string `yaml:"password" validate:"required_if=Dummy false"` // READ FROM ASM
}

type SendGrid struct {
	Dummy bool `yaml:"dummy" default:"false"`

	APIKey string `yaml:"api_key" validate:"required_if=Dummy false"` // READ FROM ASM
}

type FADConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`

	DataServicePublicKey  string `yaml:"ds_public_key" validate:"required_if=Dummy false"`
	DataServicePrivateKey string `yaml:"ds_private_key" validate:"required_if=Dummy false"`
}

type InfraAPIServerConfig struct {
	Dummy bool `yaml:"dummy" default:"false"`

	KubeConfigSecretName string `yaml:"kubeConfigSecretName" validate:"required_if=Dummy false"`
}

type LLMConfig struct {
	BedrockToken string `yaml:"bedrockToken"` // READ FROM ASM
	GeminiKey    string `yaml:"geminiKey"`    // READ FROM ASM
}

type ClinicServer struct {
	Addr  string `yaml:"addr" validate:"required"`
	Token string `yaml:"token" validate:"required"` // READ FROM ASM
}

type AIOpsServerConfig struct {
	Addr   string `yaml:"addr" validate:"required"`
	APIKey string `yaml:"apiKey" validate:"required"` // READ FROM ASM
}

type AccountServer struct {
	AK string `yaml:"ak"`
	SK string `yaml:"sk"`
}

type GithubActionConfig struct {
	Token string `yaml:"token" validate:"required"` // READ FROM ASM
	Owner string `yaml:"owner" validate:"required"`
	Repo  string `yaml:"repo" validate:"required"`
}

type OnCallConfig struct {
	Dummy      bool   `yaml:"dummy" default:"false"`
	Addr       string `yaml:"addr" validate:"required_if=Dummy false"`
	ServiceKey string `yaml:"serviceKey" validate:"required_if=Dummy false"` // READ FROM ASM
}
