package config

import (
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/secretsmanager"
	"github.com/imdario/mergo"
	"github.com/pingcap/errors"
	"gopkg.in/yaml.v3"
)

func getSecretFromAwsSecretManager(secretName, region string) (string, error) {
	awsConfig := aws.NewConfig().WithMaxRetries(3).WithRegion(region)
	opts := session.Options{Config: *awsConfig}
	sess, err := session.NewSessionWithOptions(opts)
	if err != nil {
		return "", err
	}
	svc := secretsmanager.New(sess)
	input := &secretsmanager.GetSecretValueInput{
		SecretId:     aws.String(secretName),
		VersionStage: aws.String("AWSCURRENT"),
	}
	result, err := svc.GetSecretValue(input)
	if err != nil {
		return "", err
	}
	return *result.SecretString, nil
}

func merge(cfg *Config) error {
	if cfg.SecretStore == nil {
		return nil
	}

	secretConfig, err := getSecretFromAwsSecretManager(cfg.SecretStore.SecretKey, cfg.SecretStore.Region)
	if err != nil {
		return errors.Annotate(err, "failed to load secret config from aws")
	}
	var cfgInAws Config
	if err := yaml.Unmarshal([]byte(secretConfig), &cfgInAws); err != nil {
		return errors.Annotate(err, "failed to unmarshal secret config")
	}

	if err := mergo.Merge(cfg, cfgInAws, mergo.WithOverride); err != nil {
		return errors.Annotate(err, "failed to merge secret config")
	}

	return nil
}
