package contract

import (
	"context"

	"github.com/nexuscrm/shared/pkg/models"
)

// RecordWriteValidationPhase identifies a generic write validation point in
// the records engine. App packs own which object metadata declares which
// capabilities for these phases.
type RecordWriteValidationPhase string

const (
	RecordWriteValidationBeforeCreate  RecordWriteValidationPhase = "before_create"
	RecordWriteValidationBeforeUpdate  RecordWriteValidationPhase = "before_update"
	RecordWriteValidationBeforeDelete  RecordWriteValidationPhase = "before_delete"
	RecordWriteValidationBeforeRestore RecordWriteValidationPhase = "before_restore"
	RecordWriteValidationBeforePurge   RecordWriteValidationPhase = "before_purge"
)

type RecordWriteValidationEvent struct {
	ObjectName  string
	RecordID    string
	Record      Record
	OldRecord   Record
	CurrentUser *models.UserSession

	// PendingCreates contains the same-object rows in the current bulk-create
	// batch after final IDs are known and before persistence. It is empty for
	// non-create phases and single-record creates.
	PendingCreates []RecordWriteValidationPendingCreate
}

type RecordWriteValidationPendingCreate struct {
	RecordID string
	Record   Record
}

type RecordWriteValidator func(context.Context, RecordWriteValidationEvent) error

type RecordWriteValidatorRegistrar interface {
	RegisterRecordWriteValidator(RecordWriteValidatorRegistration) error
}

type RecordWriteValidatorRegistration struct {
	Capability string
	Phase      RecordWriteValidationPhase
	Validator  RecordWriteValidator
}

// RecordWriteCanonicalizationEvent is a mutable write image passed to a
// declared canonicalizer before validation observes the row. Canonicalizers may
// normalize Record and EffectiveUpdates in-place; OldRecord is read-only context.
type RecordWriteCanonicalizationEvent struct {
	ObjectName       string
	RecordID         string
	Record           Record
	OldRecord        Record
	EffectiveUpdates Record
	CurrentUser      *models.UserSession
}

type RecordWriteCanonicalizer func(context.Context, RecordWriteCanonicalizationEvent) error

type RecordWriteCanonicalizerRegistrar interface {
	RegisterRecordWriteCanonicalizer(RecordWriteCanonicalizerRegistration) error
}

type RecordWriteCanonicalizerRegistration struct {
	Capability    string
	Phase         RecordWriteValidationPhase
	Canonicalizer RecordWriteCanonicalizer
}
