package idlewatcher

import (
	"context"
	"errors"

	"github.com/docker/docker/api/types/container"
)

type (
	containerMeta struct {
		ContainerID, ContainerName string
	}
	containerState struct {
		running bool
		ready   bool
		err     error
	}
)

func (w *Watcher) ContainerID() string {
	return w.route.ContainerInfo().ContainerID
}

func (w *Watcher) ContainerName() string {
	return w.route.ContainerInfo().ContainerName
}

func (w *Watcher) containerStop(ctx context.Context) error {
	return w.client.ContainerStop(ctx, w.ContainerID(), container.StopOptions{
		Signal:  string(w.Config().StopSignal),
		Timeout: &w.Config().StopTimeout,
	})
}

func (w *Watcher) containerPause(ctx context.Context) error {
	return w.client.ContainerPause(ctx, w.ContainerID())
}

func (w *Watcher) containerKill(ctx context.Context) error {
	return w.client.ContainerKill(ctx, w.ContainerID(), string(w.Config().StopSignal))
}

func (w *Watcher) containerUnpause(ctx context.Context) error {
	return w.client.ContainerUnpause(ctx, w.ContainerID())
}

func (w *Watcher) containerStart(ctx context.Context) error {
	return w.client.ContainerStart(ctx, w.ContainerID(), container.StartOptions{})
}

func (w *Watcher) containerStatus() (string, error) {
	ctx, cancel := context.WithTimeoutCause(w.task.Context(), dockerReqTimeout, errors.New("docker request timeout"))
	defer cancel()
	json, err := w.client.ContainerInspect(ctx, w.ContainerID())
	if err != nil {
		return "", err
	}
	return json.State.Status, nil
}