package backend

import (
	"errors"
	"fmt"
	"net/http"
	"strings"
	"time"
)

const (
	MediaProviderProtocolOpenAI  = "openai"
	MediaProviderProtocolQwenASR = "qwen-asr"
)

var ErrUnsupportedMediaProvider = errors.New("unsupported media provider protocol")

func NormalizeMediaProviderProtocol(raw string) string {
	if v := strings.ToLower(strings.TrimSpace(raw)); v != "" {
		return v
	}
	return MediaProviderProtocolOpenAI
}

func IsUnsupportedMediaProviderError(err error) bool {
	return errors.Is(err, ErrUnsupportedMediaProvider)
}

type AudioTextExtractorConfig struct {
	BaseURL        string
	APIKey         string
	Model          string
	Prompt         string
	ResponseFormat string
	Timeout        time.Duration
	Client         *http.Client
}

func NewAudioTextExtractorForProtocol(protocol string, cfg AudioTextExtractorConfig) (AudioTextExtractor, error) {
	switch NormalizeMediaProviderProtocol(protocol) {
	case MediaProviderProtocolOpenAI:
		return NewOpenAIAudioTextExtractor(OpenAIAudioTextExtractorConfig(cfg))
	case MediaProviderProtocolQwenASR:
		return NewQwenASRAudioTextExtractor(QwenASRAudioTextExtractorConfig{
			BaseURL: cfg.BaseURL, APIKey: cfg.APIKey, Model: cfg.Model, Prompt: cfg.Prompt, Timeout: cfg.Timeout, Client: cfg.Client,
		})
	default:
		return nil, fmt.Errorf("%w: %s", ErrUnsupportedMediaProvider, NormalizeMediaProviderProtocol(protocol))
	}
}

// NewVideoTextExtractorForProtocol constructs the supported vision provider.
// The protocol is explicit so adding another wire format does not require
// guessing from a model name.
func NewVideoTextExtractorForProtocol(protocol string, cfg OpenAIVideoTextExtractorConfig) (VideoTextExtractor, error) {
	switch NormalizeMediaProviderProtocol(protocol) {
	case MediaProviderProtocolOpenAI:
		return NewOpenAIVideoTextExtractor(cfg)
	default:
		return nil, fmt.Errorf("%w: %s", ErrUnsupportedMediaProvider, NormalizeMediaProviderProtocol(protocol))
	}
}
