package commands

import (
	"log/slog"
	"os"
	"os/signal"
	"syscall"

	"github.com/iomodo/staff/server"
	"github.com/spf13/cobra"
)

// Command is an abstraction of the cobra Command
type Command = cobra.Command

// Run function starts the application
func Run(args []string) error {
	rootCmd.SetArgs(args)
	return rootCmd.Execute()
}

// rootCmd is a command to run the server.
var rootCmd = &cobra.Command{
	Use:   "server",
	Short: "Runs a server",
	Long:  `Runs a server. Killing the process will stop the server`,
	RunE:  serverCmdF,
}

func serverCmdF(_ *cobra.Command, _ []string) error {
	srv, err := runServer()
	if err != nil {
		return err
	}
	defer srv.Shutdown()

	// wait for kill signal before attempting to gracefully shutdown
	// the running service
	interruptChan := make(chan os.Signal, 1)
	signal.Notify(interruptChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
	<-interruptChan
	return nil
}

func runServer() (*server.Server, error) {
	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
		Level: slog.LevelDebug,
	}))

	srv, err := server.NewServer(logger)
	if err != nil {
		logger.Error(err.Error())
		return nil, err
	}

	serverErr := srv.Start()
	if serverErr != nil {
		logger.Error(serverErr.Error())
		return nil, serverErr
	}
	return srv, nil
}
