package automation

import (
	"strings"

	connector "github.com/pingcap-inc/nexuscrm-contract/pkg/connector"
)

func connectorPushDurableSnapshotFromMetadata(flowIdentity FlowExecutionIdentity, contract *connector.ConnectorPushDurableMetadataContract, mappings []connector.ConnectorFieldMappingInput, profile *ConnectorPushProfile, originatingUserID string) ConnectorPushDurableSnapshot {
	snapshot := ConnectorPushDurableSnapshot{
		RequesterOwnerPack:      strings.TrimSpace(flowIdentity.OwnerPack),
		ProfileOwnerPack:        strings.TrimSpace(profile.OwnerPack),
		ConnectorNamespace:      strings.TrimSpace(contract.ConnectorOwnerKey),
		FlowDeveloperName:       strings.TrimSpace(contract.FlowDeveloperName),
		FlowActionName:          strings.TrimSpace(contract.FlowActionName),
		TargetObject:            strings.TrimSpace(contract.TargetObject),
		ProfileName:             strings.TrimSpace(profile.ProfileName),
		CreatedPackInstallID:    strings.TrimSpace(profile.CreatedPackInstallID),
		CredentialRef:           strings.TrimSpace(profile.CredentialRef),
		EndpointClass:           strings.TrimSpace(profile.EndpointClass),
		RetryPolicy:             profile.RetryPolicy,
		CreatePathTemplate:      strings.TrimSpace(contract.CreatePathTemplate),
		UpdatePathTemplate:      strings.TrimSpace(contract.UpdatePathTemplate),
		ResponseIDPath:          strings.TrimSpace(contract.ResponseIDPath),
		RemoteIDField:           strings.TrimSpace(contract.RemoteIDField),
		RemoteIDProvenanceField: strings.TrimSpace(contract.RemoteIDProvenanceField),
		MappingFingerprint:      ConnectorPushFieldMappingFingerprint(mappings),
		BodyFingerprint:         ConnectorPushContractBodyFingerprint(contract, mappings),
		CreateConflictResolutionFingerprint: ConnectorPushCreateConflictResolutionFingerprint(
			contract.CreateConflictResolution,
		),
		OriginatingUserID: strings.TrimSpace(originatingUserID),
	}
	snapshot.ProfileContractHash = ConnectorPushProfileContractHash(snapshot)
	return snapshot
}

func connectorPushDurableIdentityFromContract(contract *connector.ConnectorPushDurableMetadataContract, sourceRecordID string) ConnectorPushDurableIdentity {
	return ConnectorPushDurableIdentity{
		ConnectorOwnerKey: strings.TrimSpace(contract.ConnectorOwnerKey),
		ActionSlotID:      strings.TrimSpace(contract.ActionSlotID),
		ActionType:        strings.TrimSpace(contract.ActionType),
		SourceObject:      strings.TrimSpace(contract.SourceObject),
		SourceRecordID:    strings.TrimSpace(sourceRecordID),
		DestinationSlotID: strings.TrimSpace(contract.DestinationSlotID),
	}
}
