package model

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

type KafkaDimensions struct {
	NetworkType    DataflowNetworkType   `yaml:"networkType"`
	AuthType       DataflowKafkaAuthType `yaml:"authType"`
	TLSEnabled     bool                  `yaml:"tlsEnabled"`
	IsCustomDomain bool                  `yaml:"isCustomDomain"`

	// optional dimensions only for Private Link or Private Service Connect NetworkType
	CloudProvider CloudProviderType `yaml:"cloudProvider"`
	Region        string            `yaml:"region"`
}

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

type KafkaRequirement struct {
	KafkaDimensions
}

func (t *KafkaRequirement) Type() string {
	return KAFKA
}

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

type KafkaEntity struct {
	CreatedByDriver bool
	KafkaDimensions `yaml:",inline"`
	User            string `yaml:"user"`
	Password        string `yaml:"password"`

	// ProjectID identifies the downstream Kafka project for Private Link DNS
	// validation. It is intentionally not a dependency matching dimension so a
	// shared Kafka fixture can be reused by different TiDB Cloud projects.
	ProjectID string `yaml:"projectID"`

	// for NetworkType_Public
	BootstrapEndpoints string `yaml:"bootstrapEndpoints"`

	// for NetworkType_Private_Link
	KafkaID                string            `yaml:"kafkaID"`
	PrivateLinkServiceName string            `yaml:"privateLinkServiceName"`
	Ports                  []int64           `yaml:"ports"`
	RootDomainName         string            `yaml:"rootDomainName"`
	DnsRecords             map[string]string `yaml:"dnsRecords"`
}

func (t *KafkaEntity) Type() string {
	return KAFKA
}
func (t *KafkaEntity) IsCreatedByDriver() bool {
	return t.CreatedByDriver
}

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

type KafkaEntities []*KafkaEntity

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