package model

import (
	"fmt"

	"github.com/tidbcloud/dataflow-service-e2e/internal/misc"
	"github.com/tidbcloud/dataflow-service-e2e/internal/sample_data"
)

type TiDBPremiumDimensions struct {
	CloudProvider CloudProviderType
	Region        string
}

func NewTiDBPremiumDimensions(m map[string]string) TiDBPremiumDimensions {
	t := TiDBPremiumDimensions{}
	err := misc.MapToStruct(m, &t)
	if err != nil {
		panic(fmt.Sprintf("failed to init TiDBPremiumDimensions, error: %s, map: %v", err.Error(), m))
	}
	return t
}

func (t TiDBPremiumDimensions) Dimensions() map[string]string {
	return misc.StructToMap(t)
}

type TiDBPremiumRequirement struct {
	Dedicated bool
	TiDBPremiumDimensions
}

func (t *TiDBPremiumRequirement) Type() string {
	return TiDBPremium
}
func (t *TiDBPremiumRequirement) IsDedicated() bool {
	return t.Dedicated
}

type TiDBPremiumEntity struct {
	TiDBPremiumDimensions

	CreatedByDriver bool

	ClusterID   string
	OrgID       string
	DisplayName string
	// fetch and set by the case driver
	User     string
	Password string
	Host     string
	Port     string
	CACert   string
}

func (t *TiDBPremiumEntity) Type() string {
	return TiDBPremium
}
func (t *TiDBPremiumEntity) IsCreatedByDriver() bool {
	return t.CreatedByDriver
}

func (t *TiDBPremiumEntity) MysqlParameter() *sample_data.MysqlParameter {
	return &sample_data.MysqlParameter{
		User:     t.User,
		Password: t.Password,
		Host:     t.Host,
		Port:     t.Port,
		CACert:   t.CACert,
	}
}

type TiDBPremiumEntities []*TiDBPremiumEntity

func (t TiDBPremiumEntities) ToDependencyEntities() []DependencyEntity {
	var entities []DependencyEntity
	for _, it := range t {
		entities = append(entities, it)
	}
	return entities
}
