package container

import (
	"context"
	"errors"
	"io"
	"log/slog"

	"github.com/docker/docker/api/types/events"
	"github.com/docker/docker/api/types/filters"
)

func handleEvents(
	ctx context.Context,
	containerID string,
	apiClient DockerClient,
	logger *slog.Logger,
	ch chan events.Message,
) {
	getEvents := func() (bool, error) {
		recvC, errC := apiClient.Events(ctx, events.ListOptions{
			Filters: filters.NewArgs(
				filters.Arg("container", containerID),
				filters.Arg("type", "container"),
			),
		})

		for {
			select {
			case <-ctx.Done():
				return false, ctx.Err()
			case evt := <-recvC:
				ch <- evt
			case err := <-errC:
				if ctx.Err() != nil || errors.Is(err, io.EOF) {
					return false, err
				}

				return true, err
			}
		}
	}

	go func() {
		for {
			shouldRetry, err := getEvents()
			if !shouldRetry {
				break
			}

			logger.Warn("Error receiving Docker events", "err", err, "id", shortID(containerID))
		}
	}()
}