package config

import (
	"github.com/creasty/defaults"
	"github.com/go-playground/validator/v10"
)

var validate = validator.New()

type RootConfig struct {
	Log LogConfig `yaml:"log"`

	Jira JiraConfig `yaml:"jira" validate:"required"`

	Clinic ClinicConfig `yaml:"clinic" validate:"required"`

	GRpcServer GrpcServerConfig `yaml:"gRpcServer"`

	Anaylze AnalyzeConfig `yaml:"analyze"`
}

type LogConfig struct {
	Level int16 `yaml:"level" default:"0"`
}

type JiraConfig struct {
	ClientAddr string `yaml:"clientAddr" validate:"required"`
	Token      string `yaml:"token" validate:"required"`
}

type ClinicConfig struct {
	ClinicAddr        string            `yaml:"clinicAddr" validate:"required"`
	PromAddr          string            `yaml:"promAddr" validate:"required"`
	Token             string            `yaml:"token" validate:"required"`
	Auth0URL          string            `yaml:"auth0URL" validate:"required"`
	Auth0GrantType    string            `yaml:"auth0GrantType" validate:"required"`
	Auth0ClientID     string            `yaml:"auth0ClientID" validate:"required"`
	Auth0ClientSecret string            `yaml:"auth0ClientSecret" validate:"required"`
	Auth0Audience     string            `yaml:"auth0Audience" validate:"required"`
	Auth0Cookie       string            `yaml:"auth0Cookie" validate:"required"`
	Domain            map[string]string `yaml:"domain" validate:"required"`
	Vendor            map[string]string `yaml:"vendor" validate:"required"`
	EventURL          string            `yaml:"eventURL" validate:"required"`
	EventSource       string            `yaml:"eventSource" validate:"required"`
	EventKey          string            `yaml:"eventKey" validate:"required"`
}

type GrpcServerConfig struct {
	ListenAddr string `yaml:"listenAddr" default:":8081"`
}

type AnalyzeConfig map[string]AlertReasons

type AlertReasons map[string]AlertReason

type AlertReason struct {
	Params []AlertReasonParam `yaml:"params" validate:"required"`
	Action string             `yaml:"action" validate:"required"`
}

type AlertReasonParam map[string]interface{}

func NewDefault() (*RootConfig, error) {
	conf := &RootConfig{}
	err := defaults.Set(conf)
	return conf, err
}

func (c *RootConfig) Validate() error {
	return validate.Struct(c)
}
