package workspace

import (
	"net/http"
	"strings"

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

// MiniappPairingHandler owns the workspace-scoped miniapp pairing issue route.
// The exchange side lives in the auth package because it mints a fresh session.
type MiniappPairingHandler struct {
	workspaceService WorkspaceService
}

// Issue handles POST /api/v1/workspaces/:workspaceId/miniapp-pairing-codes.
// The workspace ownership check happens in RequireRouteWorkspace middleware
// before this handler runs, so the caller is already authorized.
func (handler *MiniappPairingHandler) Issue(r api.AuthenticatedJSON[dto.MiniappPairingIssueRequest]) (api.Response, error) {
	workspaceID := strings.TrimSpace(r.Gin.Param("workspaceId"))
	if workspaceID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "workspaceId is required")
	}

	request := r.Body
	serverURL := strings.TrimSpace(request.ServerURL)
	if serverURL == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "serverUrl is required")
	}

	result, err := handler.workspaceService.CreateMiniappPairingCode(r.Context(), r.UserID(), workspaceID, serverURL)
	if err != nil {
		return api.Response{}, err
	}

	return api.OK(dto.MiniappPairingIssueResponse{
		Code:      result.Code,
		ExpiresAt: result.ExpiresAt.UTC().Format("2006-01-02T15:04:05Z"),
	}), nil
}
