package model

import (
	"github.com/tidbcloud/dataflow-service-e2e/internal/misc"
	"gopkg.in/yaml.v2"
)

type MySQLDimensions struct {
	NetworkType DataflowNetworkType `yaml:"networkType"`

	// optional dimensions only for VPC peering NetworkType
	CloudProvider CloudProviderType `yaml:"cloudProvider"`
	Region        string            `yaml:"region"`
}

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

type MySQLRequirement struct {
	MySQLDimensions
}

func (t *MySQLRequirement) Type() string {
	return MySQL
}

func (t *MySQLRequirement) IsDedicated() bool {
	// Notice: we don't support dedicated mysql a specific case
	return false
}

type MySQLEntity struct {
	CreatedByDriver bool
	MySQLDimensions `yaml:",inline"`

	// for NetworkType_Public, NetworkType_VPC_Peering
	Endpoint string `yaml:"endpoint"`

	// for NetworkType_Private_Link
	PrivateLinkServiceName string  `yaml:"privateLinkServiceName"`
	Ports                  []int64 `yaml:"ports"`

	User     string `yaml:"user"`
	Password string `yaml:"password"`
}

func (t *MySQLEntity) Type() string {
	return MySQL
}
func (t *MySQLEntity) IsCreatedByDriver() bool {
	return t.CreatedByDriver
}

func (t *MySQLEntity) Copy() *MySQLEntity {
	data, err := yaml.Marshal(t)
	if err != nil {
		panic(err)
	}
	var copied MySQLEntity
	err = yaml.Unmarshal(data, &copied)
	return &copied
}

type MySQLEntities []*MySQLEntity

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