package premium_dm

import (
	"strconv"

	v1beta2 "github.com/tidbcloud/dataflow-service-ng/idl/pbgen/proto/premium_dm/v1beta2"
	mgmt "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tiinf/sdk/auditlog"
)

const premiumServicePlan = "premium"

func buildPremiumMigrationCreateDetails(
	req *v1beta2.CreatePremiumMigrationReq,
	migrationID string,
	cluster *mgmt.Cluster,
	rErr error,
) auditlog.Details {
	details := auditlog.Details{
		auditlog.KeyJobName:           req.GetDisplayName(),
		auditlog.KeyMigrationJobType:  req.GetMode().String(),
		auditlog.KeyTargetUsername:    req.GetTarget().GetUser(),
		auditlog.KeyTargetRegion:      cluster.GetRegion(),
		auditlog.KeyTargetClusterId:   cluster.GetClusterId(),
		auditlog.KeyTargetClusterName: cluster.GetClusterName(),
		auditlog.KeyServicePlan:       premiumServicePlan,
		auditlog.KeyImportMode:        req.GetImportMode().String(),
		auditlog.KeyError:             rErr,
	}
	if migrationID != "" {
		details[auditlog.KeyMigrationId] = migrationID
	}
	appendPremiumSourceDetails(details, req.GetSources())
	return details
}

func buildPremiumMigrationOperateDetails(
	migrationID, displayName string,
	cluster *mgmt.Cluster,
	rErr error,
) auditlog.Details {
	return auditlog.Details{
		auditlog.KeyMigrationId:       migrationID,
		auditlog.KeyJobName:           displayName,
		auditlog.KeyTargetClusterId:   cluster.GetClusterId(),
		auditlog.KeyTargetClusterName: cluster.GetClusterName(),
		auditlog.KeyTargetRegion:      cluster.GetRegion(),
		auditlog.KeyServicePlan:       premiumServicePlan,
		auditlog.KeyError:             rErr,
	}
}

func appendPremiumSourceDetails(details auditlog.Details, sources []*v1beta2.PremiumDMSource) {
	if len(sources) == 0 || sources[0] == nil {
		return
	}
	source := sources[0]
	details[auditlog.KeySourceDataSource] = source.GetSourceType().String()
	connProfile := source.GetConnProfile()
	if connProfile == nil {
		return
	}
	details[auditlog.KeySourceConnectivityMethod] = connProfile.GetConnType().String()
	details[auditlog.KeySourcePort] = connProfile.GetPort()
	details[auditlog.KeySourceUsername] = connProfile.GetUser()
	if connProfile.GetConnType() == v1beta2.PremiumDMConnType_PRIVATELINK {
		if connProfile.GetSinkEndpointId() != 0 {
			details[auditlog.KeyPrivateEndpointForExternalServiceId] = strconv.FormatUint(
				connProfile.GetSinkEndpointId(), 10,
			)
		}
	} else if host := connProfile.GetHost(); host != "" {
		details[auditlog.KeySourceHostnameOrIpaddress] = host
	}
	details[auditlog.KeySourceEnableTls] = hasPremiumDMSourceSecurityTLS(connProfile.GetSecurity())
}

func hasPremiumDMSourceSecurityTLS(security *v1beta2.Security) bool {
	if security == nil {
		return false
	}
	return len(security.GetSslCaContent()) > 0 ||
		len(security.GetSslCertContent()) > 0 ||
		len(security.GetSslKeyContent()) > 0
}
