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
	gitInterface git.GitInterface
)

// 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
}
