package app

import (
	"context"
	"fmt"
	"strings"

	abraFormatter "coopcloud.tech/abra/cli/formatter"
	"coopcloud.tech/abra/cli/internal"
	"coopcloud.tech/abra/client"
	"github.com/docker/cli/cli/command/formatter"
	"github.com/docker/cli/cli/command/idresolver"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/swarm"
	"github.com/sirupsen/logrus"
	"github.com/urfave/cli/v2"
)

var appPsCommand = &cli.Command{
	Name: "ps",
	Action: func(c *cli.Context) error {
		ctx := context.Background()
		cl, err := client.NewClientWithContext(internal.Context)
		if err != nil {
			logrus.Fatal(err)
		}
		tasks, err := cl.TaskList(ctx, types.TaskListOptions{})
		if err != nil {
			logrus.Fatal(err)
		}
		for _, task := range tasks {
			resolver := idresolver.New(cl, false)
			serviceName, err := resolver.Resolve(ctx, swarm.Service{}, task.ServiceID)
			if err != nil {
				return err
			}
			fmt.Printf("%#v\n", serviceName)
		}
		containers, err := cl.ContainerList(ctx, types.ContainerListOptions{})
		if err != nil {
			logrus.Fatal(err)
		}
		table := abraFormatter.CreateTable([]string{"ID", "Image", "Command", "Created", "Status", "Ports", "Names"})
		var conTable [][]string
		for _, container := range containers {
			conRow := []string{
				abraFormatter.ShortenID(container.ID),
				abraFormatter.RemoveSha(container.Image),
				abraFormatter.Truncate(container.Command),
				abraFormatter.HumanDuration(container.Created),
				container.Status,
				formatter.DisplayablePorts(container.Ports),
				strings.Join(container.Names, ","),
			}
			conTable = append(conTable, conRow)
		}
		table.AppendBulk(conTable)
		table.Render()
		return nil
	},
}