package formatter

import "github.com/docker/docker/api/types"

const (
	defaultCheckpointFormat = "table {{.Name}}"

	checkpointNameHeader = "CHECKPOINT NAME"
)

// NewCheckpointFormat returns a format for use with a checkpoint Context
func NewCheckpointFormat(source string) Format {
	switch source {
	case TableFormatKey:
		return defaultCheckpointFormat
	}
	return Format(source)
}

// CheckpointWrite writes formatted checkpoints using the Context
func CheckpointWrite(ctx Context, checkpoints []types.Checkpoint) error {
	render := func(format func(subContext subContext) error) error {
		for _, checkpoint := range checkpoints {
			if err := format(&checkpointContext{c: checkpoint}); err != nil {
				return err
			}
		}
		return nil
	}
	return ctx.Write(newCheckpointContext(), render)
}

type checkpointContext struct {
	HeaderContext
	c types.Checkpoint
}

func newCheckpointContext() *checkpointContext {
	cpCtx := checkpointContext{}
	cpCtx.header = volumeHeaderContext{
		"Name": checkpointNameHeader,
	}
	return &cpCtx
}

func (c *checkpointContext) MarshalJSON() ([]byte, error) {
	return marshalJSON(c)
}

func (c *checkpointContext) Name() string {
	return c.c.Name
}