package runtimeapi

import (
	"context"
	"errors"

	"github.com/pingcap-inc/nexuscrm-api-host/runtimegrpc"
	semantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/layoutauthoringv2"
	"google.golang.org/grpc"
)

type LayoutAuthoringV2Selection struct {
	OrgID             string
	AppInstallationID string
	WorkloadID        string
}

type LayoutAuthoringV2Admission struct{ selection LayoutAuthoringV2Selection }

func NewLayoutAuthoringV2Admission(selection LayoutAuthoringV2Selection) (*LayoutAuthoringV2Admission, error) {
	if selection.OrgID == "" || selection.AppInstallationID == "" || selection.WorkloadID == "" {
		return nil, errors.New("Layout authoring v2 admission requires org, installation, and workload")
	}
	return &LayoutAuthoringV2Admission{selection: selection}, nil
}

func (admission *LayoutAuthoringV2Admission) UnaryServerInterceptor() grpc.UnaryServerInterceptor {
	return func(ctx context.Context, request any, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
		capability, ok := runtimegrpc.Capability(ctx)
		if !ok || capability != semantic.CapabilityName {
			return handler(ctx, request)
		}
		trusted, ok := trustedCallFromContext(ctx)
		if !ok {
			return nil, runtimegrpc.StatusError(ctx, &semantic.Failure{Category: semantic.FailureUnauthenticated})
		}
		if admission == nil || trusted.orgID != admission.selection.OrgID || trusted.appInstallationID != admission.selection.AppInstallationID || trusted.callerWorkloadID != admission.selection.WorkloadID {
			return nil, runtimegrpc.StatusError(ctx, &semantic.Failure{Category: semantic.FailureForbidden})
		}
		return handler(ctx, request)
	}
}
