package contract

import (
	"context"
	"time"
)

// ConnectorWebhookSecrets is the neutral admin surface for connector-pack
// webhook secret definitions and active values.
type ConnectorWebhookSecrets interface {
	ListConnectorWebhookSecrets(ctx context.Context, namespace string) ([]ConnectorWebhookSecret, error)
	RotateConnectorWebhookSecret(ctx context.Context, id string, secretValue string) (*ConnectorWebhookSecretRotation, error)
}

type ConnectorWebhookSecret struct {
	ID            string
	OwnerPack     string
	Name          string
	Algorithm     string
	Description   *string
	MaskedHint    string
	LastRotatedAt *time.Time
}

type ConnectorWebhookSecretRotation struct {
	ID         string
	MaskedHint string
	RotatedAt  time.Time
}

type ConnectorWebhookSecretsErrorKind string

const (
	ConnectorWebhookSecretsErrorQueryFailed            ConnectorWebhookSecretsErrorKind = "query_failed"
	ConnectorWebhookSecretsErrorScanFailed             ConnectorWebhookSecretsErrorKind = "scan_failed"
	ConnectorWebhookSecretsErrorRowsFailed             ConnectorWebhookSecretsErrorKind = "rows_failed"
	ConnectorWebhookSecretsErrorEmptySecretValue       ConnectorWebhookSecretsErrorKind = "empty_secret_value"
	ConnectorWebhookSecretsErrorSecretTooShort         ConnectorWebhookSecretsErrorKind = "secret_too_short"
	ConnectorWebhookSecretsErrorEncryptionUnconfigured ConnectorWebhookSecretsErrorKind = "encryption_unconfigured"
	ConnectorWebhookSecretsErrorEncryptionFailed       ConnectorWebhookSecretsErrorKind = "encryption_failed"
	ConnectorWebhookSecretsErrorWebhookSecretNotFound  ConnectorWebhookSecretsErrorKind = "webhook_secret_not_found"
	ConnectorWebhookSecretsErrorUpsertFailed           ConnectorWebhookSecretsErrorKind = "upsert_failed"
)

type ConnectorWebhookSecretsError struct {
	Kind      ConnectorWebhookSecretsErrorKind
	Message   string
	Detail    string
	MinLength int
	Cause     error
}

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

func (e *ConnectorWebhookSecretsError) Unwrap() error {
	if e == nil {
		return nil
	}
	return e.Cause
}
