package agentteambridge

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

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

type namedAPRProviderBase struct {
	name   string
	models []string
	base   types.LLMProvider
}

func (provider namedAPRProviderBase) Name() string {
	return strings.TrimSpace(provider.name)
}

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

type namedOpenAIProvider struct {
	namedAPRProviderBase
	chat types.OpenAICompatible
}

func (provider namedOpenAIProvider) ChatCompletion(ctx context.Context, headers http.Header, jsonData []byte, opts ...types.CompletionOption) (*http.Response, error) {
	return provider.chat.ChatCompletion(ctx, headers, jsonData, opts...)
}

type namedOpenAIEmbeddingProvider struct {
	namedOpenAIProvider
	embedding types.EmbeddingCompatible
}

func (provider namedOpenAIEmbeddingProvider) CreateEmbedding(ctx context.Context, request *types.EmbeddingRequest) (*types.EmbeddingResponse, error) {
	return provider.embedding.CreateEmbedding(ctx, request)
}

type namedOpenAIResponsesProvider struct {
	namedOpenAIProvider
	responses types.ResponsesCompatible
}

func (provider namedOpenAIResponsesProvider) CreateResponse(ctx context.Context, headers http.Header, jsonData []byte) (*http.Response, error) {
	return provider.responses.CreateResponse(ctx, headers, jsonData)
}
