package httpapi

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strings"
)

func writeJSON(w http.ResponseWriter, status int, value any) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.WriteHeader(status)
	_ = json.NewEncoder(w).Encode(value)
}

func writeError(w http.ResponseWriter, status int, message string, codes ...string) {
	writeErrorWithDetails(w, status, message, nil, codes...)
}

func writeErrorWithDetails(w http.ResponseWriter, status int, message string, details map[string]any, codes ...string) {
	errorPayload := map[string]any{
		"message": message,
		"status":  status,
	}
	if len(codes) > 0 {
		if code := strings.TrimSpace(codes[0]); code != "" {
			errorPayload["code"] = code
			if code == "invalid_parameter" || code == "unsupported_response_parameter" {
				errorPayload["type"] = "invalid_request_error"
				if _, ok := details["param"]; !ok {
					errorPayload["param"] = nil
				}
			}
		}
	}
	for key, value := range details {
		errorPayload[key] = value
	}
	writeJSON(w, status, map[string]any{"error": errorPayload})
}

func writeLocalUserRequired(w http.ResponseWriter) {
	writeError(w, http.StatusForbidden, "该账号尚未开通 EasyAI Gateway", errorCodeGatewayUserNotProvisioned)
}

func sendSSE(w http.ResponseWriter, event string, payload any) {
	bytes, _ := json.Marshal(payload)
	_, _ = fmt.Fprintf(w, "event: %s\n", event)
	_, _ = fmt.Fprintf(w, "data: %s\n\n", bytes)
}
