package agentteambridge

import (
	"context"
	"net/http"
	"strings"
	"time"

	"github.com/tidbcloud/AgentTeam/internal/apr/types"
)

type aprProviderAdapter struct {
	base LLMProvider
}

func (adapter *aprProviderAdapter) Name() string {
	if adapter == nil || adapter.base == nil {
		return ""
	}
	return adapter.base.Name()
}

func (adapter *aprProviderAdapter) Models() []types.Model {
	if adapter == nil || adapter.base == nil {
		return nil
	}
	models := adapter.base.Models()
	result := make([]types.Model, 0, len(models))
	for _, model := range models {
		id := strings.TrimSpace(model)
		if id == "" {
			continue
		}
		result = append(result, types.Model{
			ID:      id,
			Object:  "model",
			Created: time.Now().Unix(),
			OwnedBy: adapter.base.Name(),
			Capabilities: types.Capabilities{
				Type: "chat",
			},
		})
	}
	return result
}

func (adapter *aprProviderAdapter) ChatCompletion(ctx context.Context, headers http.Header, jsonData []byte, _ ...types.CompletionOption) (*http.Response, error) {
	return adapter.base.(OpenAICompatible).ChatCompletion(ctx, headers, jsonData)
}

func (adapter *aprProviderAdapter) Messages(ctx context.Context, headers http.Header, jsonData []byte) (*http.Response, error) {
	return adapter.base.(AnthropicCompatible).Messages(ctx, headers, jsonData)
}

func (adapter *aprProviderAdapter) CreateResponse(ctx context.Context, headers http.Header, jsonData []byte) (*http.Response, error) {
	return adapter.base.(ResponsesCompatible).CreateResponse(ctx, headers, jsonData)
}

func (adapter *aprProviderAdapter) CreateEmbedding(ctx context.Context, request *types.EmbeddingRequest) (*types.EmbeddingResponse, error) {
	body, err := marshalEmbeddingRequest(request)
	if err != nil {
		return nil, err
	}
	resp, err := adapter.base.(EmbeddingCompatible).CreateEmbedding(ctx, http.Header{}, body)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	return decodeEmbeddingResponse(resp.Body)
}

func adaptProvider(provider LLMProvider) types.LLMProvider {
	if provider == nil {
		return nil
	}
	return &aprProviderAdapter{base: provider}
}

// AdaptProviderForTests exposes the APR adapter for tests outside this package.
func AdaptProviderForTests(provider LLMProvider) types.LLMProvider {
	return adaptProvider(provider)
}
