package container

import (
	"bufio"
	"context"
	"log/slog"

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

func getLogs(
	ctx context.Context,
	containerID string,
	apiClient DockerClient,
	cfg LogConfig,
	ch chan<- []byte,
	logger *slog.Logger,
) {
	logsC, err := apiClient.ContainerLogs(
		ctx,
		containerID,
		typescontainer.LogsOptions{
			ShowStdout: cfg.Stdout,
			ShowStderr: cfg.Stderr,
			Follow:     true,
		},
	)
	if err != nil {
		logger.Error("Error getting container logs", "err", err, "id", shortID(containerID))
		return
	}
	defer logsC.Close()

	scanner := bufio.NewScanner(logsC)
	for scanner.Scan() {
		select {
		case <-ctx.Done():
			return
		default:
			// Docker logs are prefixed with an 8 byte prefix.
			// See client.ContainerLogs for more details.
			// We could use
			// [StdCopy](https://pkg.go.dev/github.com/docker/docker/pkg/stdcopy#StdCopy)
			// but for our purposes it's enough to just slice it off.
			const prefixLen = 8
			line := scanner.Bytes()
			if len(line) <= prefixLen {
				continue
			}
			ch <- line[prefixLen:]
		}
	}
}