package commands

import (
	"fmt"

	"github.com/spf13/cobra"
)

var configCheckCmd = &cobra.Command{
	Use:   "config-check",
	Short: "Check configuration validity",
	Long: `Check the current configuration for errors and display settings.

Examples:
  staff config-check`,
	RunE: runConfigCheck,
}

func runConfigCheck(cmd *cobra.Command, args []string) error {
	fmt.Println("Configuration Check:")
	fmt.Println("==================")

	// Check OpenAI configuration
	if cfg.OpenAI.APIKey == "" {
		fmt.Println("❌ OpenAI API key is missing")
	} else {
		fmt.Printf("✅ OpenAI API key configured (ends with: ...%s)\n", cfg.OpenAI.APIKey[len(cfg.OpenAI.APIKey)-4:])
	}

	if cfg.OpenAI.BaseURL == "" {
		fmt.Println("ℹ️  OpenAI Base URL using default")
	} else {
		fmt.Printf("ℹ️  OpenAI Base URL: %s\n", cfg.OpenAI.BaseURL)
	}

	// Check Git provider configuration
	fmt.Printf("\nGit Provider: %s\n", cfg.GetPrimaryGitProvider())

	// Check GitHub configuration
	if cfg.HasGitHubConfig() {
		fmt.Printf("✅ GitHub configured (ends with: ...%s)\n", cfg.GitHub.Token[len(cfg.GitHub.Token)-4:])
		fmt.Printf("   Owner: %s, Repo: %s\n", cfg.GitHub.Owner, cfg.GitHub.Repo)
	} else if cfg.GitHub.Token != "" || cfg.GitHub.Owner != "" || cfg.GitHub.Repo != "" {
		fmt.Println("⚠️  GitHub partially configured (incomplete)")
	}

	// Check Gerrit configuration
	if cfg.HasGerritConfig() {
		fmt.Printf("✅ Gerrit configured (user: %s)\n", cfg.Gerrit.Username)
		fmt.Printf("   Base URL: %s, Project: %s\n", cfg.Gerrit.BaseURL, cfg.Gerrit.Project)
	} else if cfg.Gerrit.Username != "" || cfg.Gerrit.BaseURL != "" || cfg.Gerrit.Project != "" {
		fmt.Println("⚠️  Gerrit partially configured (incomplete)")
	}

	if !cfg.HasGitHubConfig() && !cfg.HasGerritConfig() {
		fmt.Println("❌ No Git provider configured (need GitHub or Gerrit)")
	}

	// Check agents configuration
	fmt.Printf("\nAgents: %d configured\n", len(cfg.Agents))
	for i, agent := range cfg.Agents {
		temp := 0.7
		if agent.Temperature != nil {
			temp = *agent.Temperature
		}
		fmt.Printf("  %d. %s (model: %s, temp: %.1f)\n", i+1, agent.Name, agent.Model, temp)
	}

	// Check task manager
	if taskManager == nil {
		fmt.Println("❌ Task manager not initialized")
	} else {
		fmt.Println("✅ Task manager initialized")
	}

	// Check agent manager
	if agentManager == nil {
		fmt.Println("❌ Agent manager not initialized")
	} else {
		fmt.Println("✅ Agent manager initialized")
	}

	fmt.Println("\nConfiguration check complete!")
	return nil
}
