package common

import (
	"fmt"
	"strings"

	"github.com/tidbcloud/dataflow-service-e2e/internal/config"
	. "github.com/tidbcloud/dataflow-service-e2e/internal/model"
	"github.com/tidbcloud/dataflow-service-e2e/internal/tidbcloud/essential"
)

// EssentialImportSampleSpec converts the configured read-only sample into the
// canonical ImportSpec used by new Essential cases.
func EssentialImportSampleSpec(provider CloudProviderType, name string) (essential.ImportSpec, error) {
	if provider == AliCloud {
		if strings.TrimSpace(config.GlobalConfig.ImportSampleData.OSS.SourceURL) == "" {
			return essential.ImportSpec{}, fmt.Errorf("Essential import OSS sample URI is empty")
		}
		return essential.ImportSpec{Name: name, Provider: AliCloud, SourceURI: config.GlobalConfig.ImportSampleData.OSS.SourceURL, Endpoint: config.GlobalConfig.ImportSampleData.OSS.Endpoint, AccessKeyID: config.GlobalConfig.ImportSampleData.OSS.AccessKeyID, AccessKeySecret: config.GlobalConfig.ImportSampleData.OSS.AccessKeySecret, FileType: "SQL"}, nil
	}
	if strings.TrimSpace(config.GlobalConfig.ImportSampleData.S3.SourceURL) == "" || strings.TrimSpace(config.GlobalConfig.ImportSampleData.S3.RoleARN) == "" {
		return essential.ImportSpec{}, fmt.Errorf("Essential import S3 sample URI or role ARN is empty")
	}
	return essential.ImportSpec{Name: name, Provider: AWS, SourceURI: config.GlobalConfig.ImportSampleData.S3.SourceURL, RoleARN: config.GlobalConfig.ImportSampleData.S3.RoleARN, FileType: "SQL"}, nil
}

// EssentialImportDataFormatSpec converts a configured importData item into the
// canonical ImportSpec used by Essential cases. RequireItem must already have
// validated the item.
func EssentialImportDataFormatSpec(item config.ImportDataItem, name string) essential.ImportSpec {
	return essential.ImportSpec{
		Name:      name,
		Provider:  AWS,
		SourceURI: item.SourceURL,
		RoleARN:   item.RoleARN,
		FileType:  item.DataFormat,
	}
}

type EssentialObjectStoreTarget struct{ URI, Region, Endpoint, RoleARN, AccessKeyID, AccessKeySecret string }

func ResolveEssentialObjectStoreTarget(provider CloudProviderType) (EssentialObjectStoreTarget, error) {
	v := config.GlobalConfig.EssentialExport
	if v == (config.BackupExportConfig{}) {
		v = config.GlobalConfig.BackupExport
	}
	if provider == AWS {
		if strings.TrimSpace(v.AWS.TargetURI) == "" || strings.TrimSpace(v.AWS.RoleARN) == "" {
			return EssentialObjectStoreTarget{}, fmt.Errorf("AWS Essential export URI or role ARN is empty")
		}
		return EssentialObjectStoreTarget{URI: v.AWS.TargetURI, Region: v.AWS.Region, Endpoint: v.AWS.Endpoint, RoleARN: v.AWS.RoleARN}, nil
	}
	if strings.TrimSpace(v.AliCloud.TargetURI) == "" || strings.TrimSpace(v.AliCloud.Endpoint) == "" || config.GlobalConfig.ImportSampleData.OSS.AccessKeyID == "" || config.GlobalConfig.ImportSampleData.OSS.AccessKeySecret == "" {
		return EssentialObjectStoreTarget{}, fmt.Errorf("AliCloud Essential export target or credentials are empty")
	}
	return EssentialObjectStoreTarget{URI: v.AliCloud.TargetURI, Region: v.AliCloud.Region, Endpoint: v.AliCloud.Endpoint, AccessKeyID: config.GlobalConfig.ImportSampleData.OSS.AccessKeyID, AccessKeySecret: config.GlobalConfig.ImportSampleData.OSS.AccessKeySecret}, nil
}
