package automation

import (
	"context"
	"time"

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

// ConnectorPushRetryPolicy is the automation-owned view of connector callout
// retry settings retained in durable identity snapshots.
type ConnectorPushRetryPolicy struct {
	MaxAttempts          int
	BaseDelay            time.Duration
	Multiplier           float64
	MaxDelay             time.Duration
	RetryableStatusCodes []int
}

type ConnectorPushProfile struct {
	OwnerPack            string
	ProfileName          string
	CreatedPackInstallID string
	CredentialRef        string
	EndpointClass        string
	RetryPolicy          ConnectorPushRetryPolicy
}

// ConnectorPushProfileResolver loads active pack-owned callout profiles behind
// an adapter. FlowExecutor does not import connector_callout, avoiding a package
// cycle through controlplane/services.
type ConnectorPushProfileResolver interface {
	ResolveConnectorPushProfile(ctx context.Context, requesterOwnerPack, ownerPack, profileName string) (*ConnectorPushProfile, error)
}

type ConnectorPushContractQuery struct {
	ConnectorOwnerKey string
	FlowDeveloperName string
	FlowActionName    string
}

// ConnectorPushContractResolver reads the pack-owned connector_push_contract
// projection. It is read-only and intentionally exposes no durable mutation.
type ConnectorPushContractResolver interface {
	ResolveConnectorPushContract(ctx context.Context, q ConnectorPushContractQuery) (*connector.ConnectorPushDurableMetadataContract, error)
}

// ConnectorInboundRemoteIdentityFinalizationAuthority is the complete,
// immutable no-HTTP authority consumed by inbound remote-identity
// finalization. Independent Runtime composition resolves this shape from the
// request-bound Catalog view in one read so contract, profile and mapping facts
// cannot cross revisions. Headless maintenance uses the installed-generation
// resolvers to validate recovery without provider HTTP.
type ConnectorInboundRemoteIdentityFinalizationAuthority struct {
	Contract         connector.ConnectorPushDurableMetadataContract
	Profile          ConnectorPushProfile
	OutboundMappings []connector.ConnectorFieldMappingInput
}

// ConnectorInboundRemoteIdentityFinalizationAuthorityResolver resolves one
// exact finalization closure. It grants no connector callout capability and
// carries no credential value.
type ConnectorInboundRemoteIdentityFinalizationAuthorityResolver interface {
	ResolveConnectorInboundRemoteIdentityFinalizationAuthority(
		ctx context.Context,
		q ConnectorPushContractQuery,
	) (*ConnectorInboundRemoteIdentityFinalizationAuthority, error)
}

// ConnectorInboundRemoteIdentityInstalledContractSet is one locked,
// converged installed-pack generation and its complete durable connector
// contract declarations. It is a lower-level metadata port; FlowExecutor
// derives source/destination identities and snapshots from it.
type ConnectorInboundRemoteIdentityInstalledContractSet struct {
	Generation           string
	Contracts            []connector.ConnectorPushDurableMetadataContract
	Mappings             []connector.ConnectorFieldMappingInput
	LockedPackInstallIDs map[string]string
}

type ConnectorInboundRemoteIdentityInstalledContractResolver interface {
	ResolveConnectorInboundRemoteIdentityInstalledContracts(
		ctx context.Context,
		connectorOwnerKey string,
	) (ConnectorInboundRemoteIdentityInstalledContractSet, error)
	ResolveConnectorInboundRemoteIdentityInstalledContractsInAmbientTx(
		ctx context.Context,
		connectorOwnerKey string,
	) (ConnectorInboundRemoteIdentityInstalledContractSet, error)
	ResolveConnectorInboundRemoteIdentityInstalledContractSetsInAmbientTx(
		ctx context.Context,
		connectorOwnerKeys []string,
	) (map[string]ConnectorInboundRemoteIdentityInstalledContractSet, error)
}

// ConnectorInboundRemoteIdentityInstalledContractRetryScoper optionally binds
// immutable installed-source parsing to one atomic Flow execution. The scope is
// created before pessimistic transaction retries begin, so every attempt may
// reuse parse work without sharing it with another request.
type ConnectorInboundRemoteIdentityInstalledContractRetryScoper interface {
	WithConnectorInboundRemoteIdentityInstalledContractRetryScope(context.Context) context.Context
}

type ConnectorPushMirrorWrite struct {
	SourceObject              string
	SourceRecordID            string
	RemoteIDField             string
	RemoteID                  string
	RemoteIDProvenanceField   string
	RemoteIDProvenance        string
	ConnectorSyncOrigin       string
	SuppressedAutomationTuple string
}
