package commands

import (
	"fmt"
	"log/slog"
	"os"

	"github.com/iomodo/staff/agent"
	"github.com/iomodo/staff/config"
	"github.com/iomodo/staff/git"
	"github.com/iomodo/staff/tm"
	"github.com/iomodo/staff/tm/git_tm"
	"github.com/spf13/cobra"
)

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

// Global variables for the MVP
var (
	agentManager *agent.Manager
	taskManager  tm.TaskManager
	cfg          *config.Config
)

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

// rootCmd is the main command for Staff MVP
var rootCmd = &cobra.Command{
	Use:   "staff",
	Short: "Staff - AI Multi-Agent Development System",
	Long: `Staff MVP - AI agents that autonomously handle development tasks and create GitHub PRs.

Examples:
  staff create-task "Add user authentication" --priority high --agent backend-engineer
  staff start-agent backend-engineer
  staff list-tasks
  staff list-agents`,
	PersistentPreRunE: initializeApp,
}

func init() {
	// Add all commands
	rootCmd.AddCommand(createTaskCmd)
	rootCmd.AddCommand(assignTaskCmd)
	rootCmd.AddCommand(startAgentCmd)
	rootCmd.AddCommand(stopAgentCmd)
	rootCmd.AddCommand(listTasksCmd)
	rootCmd.AddCommand(listAgentsCmd)
	rootCmd.AddCommand(configCheckCmd)
	rootCmd.AddCommand(cleanupClonesCmd)
	rootCmd.AddCommand(versionCmd)
}

// initializeApp loads configuration and sets up managers
func initializeApp(cmd *cobra.Command, args []string) error {
	// Skip initialization for help and version commands
	if cmd.Name() == "help" || cmd.Name() == "version" {
		return nil
	}

	// Load configuration
	var err error
	cfg, err = config.LoadConfigWithEnvOverrides("config.yaml")
	if err != nil {
		return fmt.Errorf("failed to load config: %w", err)
	}

	// Initialize task manager
	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
		Level: slog.LevelInfo,
	}))

	gitInterface := git.New(cfg, logger)
	taskManager = git_tm.NewGitTaskManager(gitInterface, cfg, logger)

	// Initialize agent manager
	agentManager, err = agent.NewManager(cfg, taskManager, logger)
	if err != nil {
		return fmt.Errorf("failed to initialize agent manager: %w", err)
	}

	return nil
}
