package mcp

import (
	"context"
	"fmt"

	"github.com/mark3labs/mcp-go/mcp"
	"github.com/mark3labs/mcp-go/server"
)

// Server wraps the mcp-go server with KorAP-specific functionality
type Server struct {
	mcpServer *server.MCPServer
	name      string
	version   string
}

// NewServer creates a new KorAP MCP server
func NewServer(name, version string) *Server {
	mcpServer := server.NewMCPServer(
		name,
		version,
		server.WithToolCapabilities(true),
	)

	return &Server{
		mcpServer: mcpServer,
		name:      name,
		version:   version,
	}
}

// AddTool registers a new tool with the server
func (s *Server) AddTool(name, description string, inputSchema map[string]interface{}, handler func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error)) error {
	if name == "" {
		return fmt.Errorf("tool name cannot be empty")
	}
	if description == "" {
		return fmt.Errorf("tool description cannot be empty")
	}

	// Create tool using mcp-go's NewTool function
	tool := mcp.NewTool(name, mcp.WithDescription(description))

	// Add the tool and handler to the MCP server
	s.mcpServer.AddTool(tool, handler)

	return nil
}

// Serve starts the MCP server using stdio transport
func (s *Server) Serve() error {
	return server.ServeStdio(s.mcpServer)
}

// GetMCPServer returns the underlying mcp-go server for advanced usage
func (s *Server) GetMCPServer() *server.MCPServer {
	return s.mcpServer
}

// GetServerInfo returns server information
func (s *Server) GetServerInfo() (string, string) {
	return s.name, s.version
}
