package model

import (
	"fmt"

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

type TiDBDedicatedDimensions struct {
	CloudProvider CloudProviderType
	Region        string
}

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

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

type TiDBDedicatedRequirement struct {
	Dedicated bool
	TiDBDedicatedDimensions
}

func (t *TiDBDedicatedRequirement) Type() string {
	return TiDBDedicated
}
func (t *TiDBDedicatedRequirement) IsDedicated() bool {
	return t.Dedicated
}

type TiDBDedicatedEntity struct {
	TiDBDedicatedDimensions

	CreatedByDriver bool

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

func (t *TiDBDedicatedEntity) Type() string {
	return TiDBDedicated
}
func (t *TiDBDedicatedEntity) IsCreatedByDriver() bool {
	return t.CreatedByDriver
}

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

type TiDBDedicatedEntities []*TiDBDedicatedEntity

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