package cvt

import (
	ccproto "github.com/tidbcloud/config-center/proto/config_center"
	dataflowng "github.com/tidbcloud/dataflow-service-ng/idl/pbgen/proto/consoleapi"
	ccent "github.com/tidbcloud/devops/entity/cloudconfig"

	"google.golang.org/protobuf/types/known/structpb"
)

type toDataflowNg struct{}
type fromDataflowNg struct{}

func (c toDataflowNg) NamedParameter(item ccent.NamedParameter) (*dataflowng.ParamItem, error) {
	val, err := structpb.NewValue(item.Value)
	if err != nil {
		return nil, err
	}

	return &dataflowng.ParamItem{
		Value:   val,
		Comment: item.Comment,
	}, nil
}
func (c toDataflowNg) ClusterType(typ ccent.ClusterType) dataflowng.ConfigClusterType {
	m := map[ccent.ClusterType]dataflowng.ConfigClusterType{
		ccent.ClusterTypeTiCDCNG:      dataflowng.ConfigClusterType_TICDC_CLUSTER,
		ccent.ClusterTypeChangefeedNG: dataflowng.ConfigClusterType_CHANGEFEED_CLUSTER,
	}
	t, exist := m[typ]
	if !exist {
		return dataflowng.ConfigClusterType_CONFIG_CLUSTER_TYPE_UNSPECIFIED
	}
	return t
}

func (c toDataflowNg) ConfigType(configType string) dataflowng.ConfigFileType {
	m := map[string]dataflowng.ConfigFileType{
		ccproto.DEDICATED_TIDB_CONFIG_TICDC:                 dataflowng.ConfigFileType_TICDC_FILE,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_KAFKA:          dataflowng.ConfigFileType_CHANGEFEED_FILE,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_MYSQL:          dataflowng.ConfigFileType_CHANGEFEED_FILE,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_S3:             dataflowng.ConfigFileType_CHANGEFEED_FILE,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_GCS:            dataflowng.ConfigFileType_CHANGEFEED_FILE,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_SERVERLESS:     dataflowng.ConfigFileType_CHANGEFEED_FILE,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_PULSAR:         dataflowng.ConfigFileType_SINK_URI,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_URI_PULSAR:     dataflowng.ConfigFileType_SINK_URI,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_URI_KAFKA:      dataflowng.ConfigFileType_SINK_URI,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_URI_SERVERLESS: dataflowng.ConfigFileType_SINK_URI,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_URI_GCS:        dataflowng.ConfigFileType_SINK_URI,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_URI_S3:         dataflowng.ConfigFileType_SINK_URI,
		ccproto.CHANGEFEED_CONFIG_CHANGEFEED_URI_MYSQL:      dataflowng.ConfigFileType_SINK_URI,
	}
	t, exist := m[configType]
	if !exist {
		return dataflowng.ConfigFileType_CONFIG_FILE_TYPE_UNSPECIFIED
	}
	return dataflowng.ConfigFileType(t)
}

func (c toDataflowNg) Component(comp string) dataflowng.ConfigFileType {
	m := map[string]dataflowng.ConfigFileType{
		ccproto.TICDC_COMPONENT_TICDC: dataflowng.ConfigFileType_TICDC_FILE,
		// use OnlyConfigCenterClusterApplier instead
		// ccproto.DEDICATED_TIDB_COMPONENT_COMPACT_BACKUP_BR:   dataflowng.ConfigFileType_COMPACT_BACKUP_BR_FILE,
		// ccproto.DEDICATED_TIDB_COMPONENT_COMPACT_BACKUP_TIKV: dataflowng.ConfigFileType_COMPACT_BACKUP_TIKV_FILE,
	}
	t, exist := m[comp]
	if !exist {
		return dataflowng.ConfigFileType_CONFIG_FILE_TYPE_UNSPECIFIED
	}
	return dataflowng.ConfigFileType(t)
}
