package contract

import (
	"context"
	"time"

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

// ConnectorSyncStatus is the neutral read surface for connector push diagnostics.
// L0 owns permission checks, record/RLS access, and durable link/attempt reads.
// Dialects own only query parsing and wire projection.
type ConnectorSyncStatus interface {
	GetConnectorSyncStatus(ctx context.Context, user *models.UserSession, objectName string, recordID string) (*ConnectorSyncStatusResult, error)
}

type ConnectorSyncStatusResult struct {
	Object       string
	RecordID     string
	SyncStatuses []ConnectorSyncStatusRow
}

type ConnectorSyncStatusRow struct {
	ConnectorOwnerKey  string
	ActionType         string
	DestinationSlotID  string
	TargetObject       string
	LinkStatus         *string
	LastAttemptStatus  *string
	ResponseStatusCode *int64
	LastErrorAt        *time.Time
}

type ConnectorSyncStatusErrorKind string

const (
	ConnectorSyncStatusErrorForbidden ConnectorSyncStatusErrorKind = "forbidden"
	ConnectorSyncStatusErrorNotFound  ConnectorSyncStatusErrorKind = "not_found"
	ConnectorSyncStatusErrorInternal  ConnectorSyncStatusErrorKind = "internal"
)

type ConnectorSyncStatusError struct {
	Kind    ConnectorSyncStatusErrorKind
	Message string
}

func (e *ConnectorSyncStatusError) Error() string {
	if e == nil {
		return ""
	}
	return e.Message
}
