package mapping

import (
	"context"

	semantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/identityv1"
	runtimev1 "github.com/pingcap-inc/nexuscrm-contract/wire-go/gen/runtime/v1"
)

func ToWireIdentityExchangeRequest(ctx context.Context, request semantic.Request) (*runtimev1.ExchangeRequest, error) {
	if err := semantic.ValidateRequest(ctx, request); err != nil {
		return nil, err
	}
	return &runtimev1.ExchangeRequest{
		AppInstallationId:            request.AppInstallationID,
		RequestedRuntimeCapabilities: append([]string(nil), request.RequestedCapabilities...),
	}, nil
}

func FromWireIdentityExchangeRequest(ctx context.Context, request *runtimev1.ExchangeRequest) (semantic.Request, error) {
	if request == nil {
		return semantic.Request{}, &semantic.Failure{Category: semantic.FailureInvalidRequest, InvalidComponent: semantic.InvalidComponentResponse}
	}
	result := semantic.Request{
		AppInstallationID:     request.GetAppInstallationId(),
		RequestedCapabilities: append([]string(nil), request.GetRequestedRuntimeCapabilities()...),
	}
	if err := semantic.ValidateRequest(ctx, result); err != nil {
		return semantic.Request{}, err
	}
	return result, nil
}

func ToWireIdentityExchangeResponse(response semantic.Response) (*runtimev1.ExchangeResponse, error) {
	if err := semantic.ValidateResponse(response); err != nil {
		return nil, err
	}
	return &runtimev1.ExchangeResponse{
		OpaqueDelegation:    response.OpaqueDelegation,
		ExpiresAtUnixSecond: response.ExpiresAtUnixSecond,
	}, nil
}

func FromWireIdentityExchangeResponse(response *runtimev1.ExchangeResponse) (semantic.Response, error) {
	if response == nil {
		return semantic.Response{}, &semantic.Failure{Category: semantic.FailureInternal}
	}
	result := semantic.Response{
		OpaqueDelegation:    response.GetOpaqueDelegation(),
		ExpiresAtUnixSecond: response.GetExpiresAtUnixSecond(),
	}
	if err := semantic.ValidateResponse(result); err != nil {
		return semantic.Response{}, err
	}
	return result, nil
}
