package ports

import (
	"context"

	"github.com/antitbone/ja4/correlator/internal/domain"
)

// EventSource defines the interface for log sources.
type EventSource interface {
	// Start begins reading events and sending them to the channel.
	// Returns an error if the source cannot be started.
	Start(ctx context.Context, eventChan chan<- *domain.NormalizedEvent) error

	// Stop gracefully stops the source.
	Stop() error

	// Name returns the source name.
	Name() string
}

// CorrelatedLogSink defines the interface for correlated log destinations.
type CorrelatedLogSink interface {
	// Write sends a correlated log to the sink.
	Write(ctx context.Context, log domain.CorrelatedLog) error

	// Flush flushes any buffered logs.
	Flush(ctx context.Context) error

	// Close closes the sink.
	Close() error

	// Name returns the sink name.
	Name() string

	// Reopen closes and reopens the sink (for log rotation on SIGHUP).
	// Optional: only FileSink implements this.
	Reopen() error
}

// CorrelationProcessor defines the interface for the correlation service.
// This allows for easier testing and alternative implementations.
type CorrelationProcessor interface {
	// ProcessEvent processes an incoming event and returns correlated logs.
	ProcessEvent(event *domain.NormalizedEvent) []domain.CorrelatedLog

	// Flush forces emission of remaining buffered events.
	Flush() []domain.CorrelatedLog

	// EmitPendingOrphans emits orphan A events whose delay has expired.
	// Called periodically by the Orchestrator ticker so orphans are not blocked
	// waiting for the next incoming event.
	EmitPendingOrphans() []domain.CorrelatedLog

	// GetBufferSizes returns the current buffer sizes for monitoring.
	GetBufferSizes() (int, int)
}
