package server

import (
	"strings"

	"coopcloud.tech/abra/cli/internal"
	"coopcloud.tech/abra/pkg/config"
	"coopcloud.tech/abra/pkg/context"
	"coopcloud.tech/abra/pkg/formatter"
	"github.com/docker/cli/cli/connhelper/ssh"
	"github.com/sirupsen/logrus"
	"github.com/urfave/cli"
)

var problemsFilter bool

var problemsFilterFlag = &cli.BoolFlag{
	Name:        "problems, p",
	Usage:       "Show only servers with potential connection problems",
	Destination: &problemsFilter,
}

var serverListCommand = cli.Command{
	Name:    "list",
	Aliases: []string{"ls"},
	Usage:   "List managed servers",
	Flags: []cli.Flag{
		problemsFilterFlag,
		internal.DebugFlag,
		internal.MachineReadableFlag,
	},
	Before: internal.SubCommandBefore,
	Action: func(c *cli.Context) error {
		dockerContextStore := context.NewDefaultDockerContextStore()
		contexts, err := dockerContextStore.Store.List()
		if err != nil {
			logrus.Fatal(err)
		}

		tableColumns := []string{"name", "host", "user", "port"}
		table := formatter.CreateTable(tableColumns)
		if internal.MachineReadable {
			defer table.JSONRender()
		} else {
			defer table.Render()
		}
		serverNames, err := config.ReadServerNames()
		if err != nil {
			logrus.Fatal(err)
		}

		for _, serverName := range serverNames {
			var row []string
			for _, ctx := range contexts {
				endpoint, err := context.GetContextEndpoint(ctx)
				if err != nil && strings.Contains(err.Error(), "does not exist") {
					// No local context found, we can continue safely
					continue
				}

				if ctx.Name == serverName {
					sp, err := ssh.ParseURL(endpoint)
					if err != nil {
						logrus.Fatal(err)
					}
					row = []string{serverName, sp.Host, sp.User, sp.Port}
				}
			}

			if len(row) == 0 {
				if serverName == "default" {
					row = []string{serverName, "local", "n/a", "n/a"}
				} else {
					row = []string{serverName, "unknown", "unknown", "unknown"}
				}
			}

			if problemsFilter {
				if row[1] == "unknown" {
					table.Append(row)
				}
			} else {
				table.Append(row)
			}
		}

		return nil
	},
}