package runtimegrpc

import (
	"context"

	mailboxauthorizationsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/mailboxauthorizationv1"
	"github.com/pingcap-inc/nexuscrm-contract/wire-go/mapping"
)

// AuthorizeConnectedMailbox exchanges an end-user bearer for the one narrow
// connected-mailbox capability. Runtime remains the authorization owner and
// returns only a stable subject, consistency receipts, and (for BEGIN) an
// opaque callback reauthorization handle.
func (c *RuntimePlatformClient) AuthorizeConnectedMailbox(
	ctx context.Context,
	bearer string,
	request mailboxauthorizationsemantic.Request,
) (mailboxauthorizationsemantic.Response, error) {
	callCtx, cancel, err := c.authorizedAttempt(
		ctx, bearer, mailboxauthorizationsemantic.CapabilityName,
	)
	if err != nil {
		return mailboxauthorizationsemantic.Response{}, err
	}
	defer cancel()
	wireRequest, err := mapping.ToWireAuthorizeConnectedMailboxRequest(callCtx, request)
	if err != nil {
		return mailboxauthorizationsemantic.Response{}, err
	}
	response, err := c.mailboxes.AuthorizeConnectedMailbox(
		c.dataContext(callCtx, mailboxauthorizationsemantic.CapabilityName),
		wireRequest,
		platformCallOptions()...,
	)
	if err != nil {
		return mailboxauthorizationsemantic.Response{}, mapping.FromPlatformStatusError(
			err, mailboxauthorizationsemantic.CapabilityName,
		)
	}
	return mapping.FromWireAuthorizeConnectedMailboxResponse(request, response)
}

// ReauthorizeConnectedMailbox consumes only the opaque one-time handle minted
// by Runtime during BEGIN. It is workload-only because the provider callback
// has no browser bearer; workloadDataContext also strips any ambient bearer or
// Runtime delegation inherited from the HTTP request context.
func (c *RuntimePlatformClient) ReauthorizeConnectedMailbox(
	ctx context.Context,
	request mailboxauthorizationsemantic.ReauthorizeRequest,
) (mailboxauthorizationsemantic.Response, error) {
	callCtx, cancel, err := c.workloadAttempt(ctx)
	if err != nil {
		return mailboxauthorizationsemantic.Response{}, err
	}
	defer cancel()
	wireRequest, err := mapping.ToWireReauthorizeConnectedMailboxRequest(callCtx, request)
	if err != nil {
		return mailboxauthorizationsemantic.Response{}, err
	}
	response, err := c.mailboxes.ReauthorizeConnectedMailbox(
		c.workloadDataContext(callCtx, mailboxauthorizationsemantic.CapabilityName),
		wireRequest,
		platformCallOptions()...,
	)
	if err != nil {
		return mailboxauthorizationsemantic.Response{}, mapping.FromPlatformStatusError(
			err, mailboxauthorizationsemantic.CapabilityName,
		)
	}
	return mapping.FromWireReauthorizeConnectedMailboxResponse(request, response)
}
