package knowledgeqa

import (
	"errors"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"

	"github.com/tidbcloud/AgentTeam/internal/api"
)

const defaultRetryAfterSeconds = 10

func mapStoreError(err error) error {
	switch {
	case errors.Is(err, ErrConversationNotFound):
		return api.ErrNotFound
	case errors.Is(err, ErrConversationForbidden):
		return api.ErrForbidden
	case errors.Is(err, ErrTurnBusy):
		return api.NewHTTPErrorWithCode(
			http.StatusConflict,
			"Another Knowledge Q&A turn is already active in this session",
			"knowledge_qa_turn_busy",
		)
	case errors.Is(err, ErrInvalidState):
		return api.NewHTTPErrorWithCode(
			http.StatusConflict,
			"Knowledge Q&A turn state changed",
			"knowledge_qa_turn_state_conflict",
		)
	default:
		return err
	}
}

func storeFailure(err error) (api.Response, error) {
	var message, code string
	switch {
	case errors.Is(err, ErrQueueFull):
		message = "Knowledge Q&A queue is full"
		code = "knowledge_qa_queue_full"
	case errors.Is(err, ErrRateLimited):
		message = "Knowledge Q&A requests are temporarily rate limited"
		code = "knowledge_qa_rate_limited"
	default:
		return api.Response{}, mapStoreError(err)
	}
	headers := make(http.Header)
	headers.Set("Retry-After", strconv.Itoa(defaultRetryAfterSeconds))
	return api.Response{
		Status:  http.StatusTooManyRequests,
		Headers: headers,
		Body: gin.H{
			"error":   code,
			"message": message,
		},
	}, nil
}

func invalidRequest(message string) error {
	return api.NewHTTPErrorWithCode(
		http.StatusBadRequest,
		message,
		"knowledge_qa_invalid_request",
	)
}

func policyUnavailable() error {
	return api.NewHTTPErrorWithCode(
		http.StatusServiceUnavailable,
		"Knowledge Q&A policy is unavailable",
		"knowledge_qa_policy_unavailable",
	)
}
