package config

import "time"

type (
	Config struct {
		Env                      string `yaml:"env" env-default:"production"`
		Host                     string `yaml:"host" env-default:"localhost"`
		Port                     int    `yaml:"port" env-default:"8000"`
		Keycloak                 Keycloak
		Broker                   Broker `yaml:"broker"`
		Secret                   SecretConfig
		EmailVerificationService EmailVerificationService `yaml:"emailVerificationService"`
		ValkeyCache              ValkeyCacheConfig        `yaml:"cache"`
		S3Storage                S3StorageConfig          `yaml:"s3Storage"`
		Database                 Database                 `yaml:"database"`
		Integration              Integration
		Build                    BuildInfo
	}

	BuildInfo struct {
		Version string
		Commit  string
		Date    string
	}

	ValkeyCacheConfig struct {
		Addrs          string        `yaml:"-" env:"CACHE_ADDRS" env-default:"localhost:6379"`
		Password       string        `yaml:"-" env:"CACHE_PASSWORD" env-default:""`
		ReadOnly       bool          `yaml:"readOnly" env-default:"false"`
		DialTimeout    time.Duration `yaml:"dialTimeout" env-default:"5s"`
		PoolSize       int           `yaml:"poolSize" env-default:"10"`
		DefaultTTL     time.Duration `yaml:"defaultTtl" env-default:"1h"`
		RootCaFilePath string        `yaml:"rootCaFilePath" env-default:""`
	}

	S3StorageConfig struct {
		Bucket         string        `yaml:"bucket" env-default:""`
		DefaultLinkTTL time.Duration `yaml:"defaultLinkTtl" env-default:"1h"`
	}

	SecretConfig struct {
		Key string `env:"SHORTENER_SECRET_KEY"` // 32-byte key
	}

	Keycloak struct {
		BaseURL      string `env:"KEYCLOAK_BASE_URL" env-default:"http://localhost"`
		Realm        string `env:"KEYCLOAK_REALM" env-default:""`
		ClientId     string `env:"KEYCLOAK_CLIENT_ID" env-default:""`
		ClientSecret string `env:"KEYCLOAK_CLIENT_SECRET" env-default:""`
	}

	Broker struct {
		Host                   string `yaml:"-" env:"BROKER_HOST" env-default:"amqp://user:password@localhost"`
		Port                   int    `yaml:"-" env:"BROKER_PORT" env-default:"5672"`
		UserName               string `yaml:"-" env:"BROKER_USERNAME" env-default:"user"`
		Password               string `yaml:"-" env:"BROKER_PASSWORD" env-default:"password"`
		NotificationsQueueName string `yaml:"notificationsQueueName" env-default:"notifications"`
	}

	// TODO: че с этим делать? Его нигде нет (ни на дев, ни на прод)
	EmailVerificationService struct {
		APIKey string `yaml:"-" env-default:""`
	}

	Database struct {
		Host           string `yaml:"-" env:"DB_HOSTS"`
		Port           uint16 `yaml:"-" env:"DB_PORT"`
		Username       string `yaml:"-" env:"DB_USERNAME"`
		Password       string `yaml:"-" env:"DB_PASSWORD"`
		DBName         string `yaml:"-" env:"DB_DBNAME"`
		Schema         string `yaml:"schema"`
		SSLMode        string `yaml:"sslmode" env-default:"verify-full"`
		RootCaFilePath string `yaml:"rootCaFilePath" env-default:"/root/YandexInternalRootCA.crt"`
	}

	Integration struct {
		Vkusvill VkusvillIntegration `yaml:"vkusvill"`
	}

	VkusvillIntegration struct {
		ApiToken string `yaml:"-" env:"INTEGRATION_VKUSVILL_API_TOKEN"`
	}
)

type (
	LocalDeploy struct {
		Deploy LocalDeployConfig `yaml:"deploy"`
	}

	LocalDeployConfig struct {
		Env []LocalDeployConfigElement `yaml:"env"`
	}

	LocalDeployConfigElement struct {
		Name  string `yaml:"name"`
		Value string `yaml:"value"`
	}
)
