package types // import "github.com/docker/docker/libcontainerd/types"

import (
	"context"
	"syscall"
	"time"

	"github.com/containerd/containerd"
	"github.com/containerd/containerd/cio"
	specs "github.com/opencontainers/runtime-spec/specs-go"
)

// EventType represents a possible event from libcontainerd
type EventType string

// Event constants used when reporting events
const (
	EventUnknown     EventType = "unknown"
	EventExit        EventType = "exit"
	EventOOM         EventType = "oom"
	EventCreate      EventType = "create"
	EventStart       EventType = "start"
	EventExecAdded   EventType = "exec-added"
	EventExecStarted EventType = "exec-started"
	EventPaused      EventType = "paused"
	EventResumed     EventType = "resumed"
)

// EventInfo contains the event info
type EventInfo struct {
	ContainerID string
	ProcessID   string
	Pid         uint32
	ExitCode    uint32
	ExitedAt    time.Time
	Error       error
}

// Backend defines callbacks that the client of the library needs to implement.
type Backend interface {
	ProcessEvent(containerID string, event EventType, ei EventInfo) error
}

// Process of a container
type Process interface {
	// Pid is the system specific process id
	Pid() uint32
	// Kill sends the provided signal to the process
	Kill(ctx context.Context, signal syscall.Signal) error
	// Resize changes the width and height of the process's terminal
	Resize(ctx context.Context, width, height uint32) error
	// Delete removes the process and any resources allocated returning the exit status
	Delete(context.Context) (*containerd.ExitStatus, error)
}

// Client provides access to containerd features.
type Client interface {
	Version(ctx context.Context) (containerd.Version, error)
	// LoadContainer loads the metadata for a container from containerd.
	LoadContainer(ctx context.Context, containerID string) (Container, error)
	// NewContainer creates a new containerd container.
	NewContainer(ctx context.Context, containerID string, spec *specs.Spec, shim string, runtimeOptions interface{}, opts ...containerd.NewContainerOpts) (Container, error)
}

// Container provides access to a containerd container.
type Container interface {
	NewTask(ctx context.Context, checkpointDir string, withStdin bool, attachStdio StdioCallback) (Task, error)
	Task(ctx context.Context) (Task, error)
	// AttachTask returns the current task for the container and reattaches
	// to the IO for the running task. If no task exists for the container
	// a NotFound error is returned.
	//
	// Clients must make sure that only one reader is attached to the task.
	AttachTask(ctx context.Context, attachStdio StdioCallback) (Task, error)
	// Delete removes the container and associated resources
	Delete(context.Context) error
}

// Task provides access to a running containerd container.
type Task interface {
	Process
	// Start begins execution of the task
	Start(context.Context) error
	// Pause suspends the execution of the task
	Pause(context.Context) error
	// Resume the execution of the task
	Resume(context.Context) error
	Stats(ctx context.Context) (*Stats, error)
	// Pids returns a list of system specific process ids inside the task
	Pids(context.Context) ([]containerd.ProcessInfo, error)
	Summary(ctx context.Context) ([]Summary, error)
	// ForceDelete forcefully kills the task's processes and deletes the task
	ForceDelete(context.Context) error
	// Status returns the executing status of the task
	Status(ctx context.Context) (containerd.Status, error)
	// Exec creates and starts a new process inside the task
	Exec(ctx context.Context, processID string, spec *specs.Process, withStdin bool, attachStdio StdioCallback) (Process, error)
	UpdateResources(ctx context.Context, resources *Resources) error
	CreateCheckpoint(ctx context.Context, checkpointDir string, exit bool) error
}

// StdioCallback is called to connect a container or process stdio.
type StdioCallback func(io *cio.DirectIO) (cio.IO, error)
