package containerd

import "time"

type EventType int

func (t EventType) String() string {
	switch t {
	case ExitEvent:
		return "exit"
	case PausedEvent:
		return "paused"
	case CreateEvent:
		return "create"
	case StartEvent:
		return "start"
	case OOMEvent:
		return "oom"
	case ExecAddEvent:
		return "execAdd"
	}
	return "unknown"
}

const (
	ExitEvent EventType = iota + 1
	PausedEvent
	CreateEvent
	StartEvent
	OOMEvent
	ExecAddEvent
)

type Event struct {
	Timestamp  time.Time
	Type       EventType
	Runtime    string
	ID         string
	Pid        uint32
	ExitStatus uint32
}

type EventWriter interface {
	Write(*Event) error
}

type EventFilter func(*Event) bool

// NewFilterEventWriter returns an EventWriter that runs the provided filters on the events.
// If all the filters pass then the event is written to the wrapped EventWriter
func NewFilterEventWriter(w EventWriter, filters ...EventFilter) EventWriter {
	return &filteredEventWriter{
		w:       w,
		filters: filters,
	}
}

type filteredEventWriter struct {
	w       EventWriter
	filters []EventFilter
}

func (f *filteredEventWriter) Write(e *Event) error {
	for _, filter := range f.filters {
		if !filter(e) {
			return nil
		}
	}
	return f.w.Write(e)
}