package interceptor

import (
	"context"

	"github.com/tidbcloud/dataflow-service/idl/pbgen/proto/dataflow"
	"github.com/tidbcloud/dataflow-service/pkg/account"
	"github.com/tidbcloud/dataflow-service/pkg/grpc/grpcli"
	"google.golang.org/grpc"
)

var userCheckerHttpMethodMap = map[string]struct{}{
	dataflow.ConnectorService_ListConnectors_FullMethodName:        {},
	dataflow.ConnectorService_GetConnector_FullMethodName:          {},
	dataflow.ConnectorService_GetClusterTCU_FullMethodName:         {},
	dataflow.ConnectorService_GetClusterTCUForAdmin_FullMethodName: {},
	dataflow.ConnectorService_DescribeSchemaTable_FullMethodName:   {},
	dataflow.ConnectorService_ScaleChangefeed_FullMethodName:       {},
	dataflow.ConnectorService_StartConnector_FullMethodName:        {},
	dataflow.ConnectorService_StopConnector_FullMethodName:         {},
	dataflow.ConnectorService_CreateConnector_FullMethodName:       {},
	dataflow.ConnectorService_EditConnector_FullMethodName:         {},
	dataflow.ConnectorService_DeleteConnector_FullMethodName:       {},
	dataflow.ConnectorService_TestConnector_FullMethodName:         {},

	dataflow.BackupService_Restore_FullMethodName:                        {},
	dataflow.BackupService_GetRestoreProgress_FullMethodName:             {},
	dataflow.BackupService_GetBackupOptions_FullMethodName:               {},
	dataflow.BackupService_GetBackupSetting_FullMethodName:               {},
	dataflow.BackupService_ModifyBackupSetting_FullMethodName:            {},
	dataflow.BackupService_CreateBackupSchedule_FullMethodName:           {},
	dataflow.BackupService_Delete_FullMethodName:                         {},
	dataflow.BackupService_DeleteDeletedClusterAndBackups_FullMethodName: {},
	dataflow.BackupService_ListPiTRTimeRanges_FullMethodName:             {},
}

// todo:refactor
func UserCheckerUnaryServerInterceptorForNewArch(coreCli grpcli.CoreGrpcClient) grpc.UnaryServerInterceptor {
	return func(ctx context.Context, req interface{},
		info *grpc.UnaryServerInfo, handler grpc.UnaryHandler,
	) (interface{}, error) {
		if _, ok := userCheckerHttpMethodMap[info.FullMethod]; !ok {
			return handler(ctx, req)
		}
		return account.UserCheckerUnaryServerInterceptor(coreCli)(ctx, req, info, handler)
	}
}
