package config

import (
	"context"

	"github.com/tidbcloud/infra-provider/pkg/config"
)

type ClusterConfig struct {
	BaseImage string
	Tag       string
	Config    map[string]interface{}
}

type ClusterConfigQuirer interface {
	Execute(ctx context.Context) (*ClusterConfig, error)
}

func ConfigQuirerFactory(rootConfig config.RootConfig, isMaster bool) ClusterConfigQuirer {
	var quirer ClusterConfigQuirer
	tiflowConfig := rootConfig.ControllerConfig.TiflowCluster
	quirer = NewLocalConfigQuirer(
		&tiflowConfig,
		isMaster,
	)

	return quirer
}

func NewLocalConfigQuirer(config *config.TiflowClusterConfig, isMaster bool) ClusterConfigQuirer {
	return &localConfigQuirer{
		Config:   config,
		IsMaster: isMaster,
	}
}

type localConfigQuirer struct {
	Config   *config.TiflowClusterConfig
	IsMaster bool
}

func (u *localConfigQuirer) Execute(ctx context.Context) (*ClusterConfig, error) {
	if u.IsMaster {
		return &ClusterConfig{
			BaseImage: u.Config.Master.ImageConfig.Repo,
			Tag:       u.Config.Master.ImageConfig.Tag,
		}, nil
	}

	return &ClusterConfig{
		BaseImage: u.Config.Executor.ImageConfig.Repo,
		Tag:       u.Config.Executor.ImageConfig.Tag,
	}, nil
}
