package main

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
)

// MCPServerConfig represents the configuration for a single MCP server
type MCPServerConfig struct {
	Command string            `json:"command"`
	Args    []string          `json:"args"`
	Env     map[string]string `json:"env,omitempty"`
}

// MCPConfig represents the root configuration for MCP servers
type MCPConfig struct {
	MCPServers map[string]MCPServerConfig `json:"mcpServers"`
}

// LoadMCPConfig loads the MCP configuration from a JSON file
func LoadMCPConfig(path string) (*MCPConfig, error) {
	// If no path provided, return empty config
	if path == "" {
		return &MCPConfig{MCPServers: make(map[string]MCPServerConfig)}, nil
	}

	// Check if file exists
	if _, err := os.Stat(path); os.IsNotExist(err) {
		// File doesn't exist, return empty config
		return &MCPConfig{MCPServers: make(map[string]MCPServerConfig)}, nil
	}

	data, err := os.ReadFile(path)
	if err != nil {
		return nil, fmt.Errorf("failed to read MCP config file: %w", err)
	}

	var config MCPConfig
	if err := json.Unmarshal(data, &config); err != nil {
		return nil, fmt.Errorf("failed to parse MCP config file: %w", err)
	}

	if config.MCPServers == nil {
		config.MCPServers = make(map[string]MCPServerConfig)
	}

	return &config, nil
}

// DefaultMCPConfigPath returns the default path for mcp.json
// It looks in the same directory as the .env file
func DefaultMCPConfigPath() string {
	// Check for mcp.json in current directory first
	if _, err := os.Stat("mcp.json"); err == nil {
		return "mcp.json"
	}

	// Check for mcp.json in the same directory as the executable
	execPath, err := os.Executable()
	if err == nil {
		execDir := filepath.Dir(execPath)
		mcpPath := filepath.Join(execDir, "mcp.json")
		if _, err := os.Stat(mcpPath); err == nil {
			return mcpPath
		}
	}

	// Default to mcp.json in current directory
	return "mcp.json"
}
