package checker

import (
	"context"

	"google.golang.org/grpc"

	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func ComposeCheckers(checkers ...Checker) CheckFunc {
	return func(
		ctx context.Context,
		checkCtx *CheckContext,
		req any,
		info *grpc.UnaryServerInfo,
	) (context.Context, any, error) {
		var err error
		for _, checker := range checkers {
			if checker == nil {
				continue
			}
			ctx, req, err = checker.Check(ctx, checkCtx, req, info)
			if err != nil {
				return ctx, req, err
			}
		}
		return ctx, req, nil
	}
}

func NewOptionalBYOCResourcePoolPermissionChecker(
	extract func(req any) (resourcePoolID string, isBYOC bool, err error),
) CheckFunc {
	resourcePoolChecker := NewResourcePoolPermissionChecker(func(req any) (string, error) {
		resourcePoolID, _, err := extract(req)
		return resourcePoolID, err
	})
	return func(
		ctx context.Context,
		checkCtx *CheckContext,
		req any,
		info *grpc.UnaryServerInfo,
	) (context.Context, any, error) {
		resourcePoolID, isBYOC, err := extract(req)
		if err != nil {
			return ctx, req, err
		}
		if resourcePoolID == "" {
			return ctx, req, nil
		}
		if !isBYOC {
			return ctx, req, bizerr.New(bizerr.ErrCodeParams, "resource_pool_id is only supported for BYOC")
		}
		return resourcePoolChecker(ctx, checkCtx, req, info)
	}
}
