package service

import (
	"context"
	"regexp"

	"github.com/tidbcloud/core-svc/idl/pbgen/proto/core"
	"github.com/tidbcloud/dataflow-service/internal/db/entity"
	"github.com/tidbcloud/dataflow-service/internal/grpc/grpcli"
	"github.com/tidbcloud/pkgv2/bizerr"
)

const (
	defaultPageValue     int32 = 1
	defaultPageSizeValue int32 = 10
)

type BaseService struct{}

func (s *BaseService) CurrentUser(ctx context.Context) *UserContext {
	return NewUserContext(ctx)
}

func (s *BaseService) CheckAndSetPageDefaultValue(page int32) (int32, error) {
	if page == 0 {
		return defaultPageValue, nil
	}
	if page < 0 {
		return 0, bizerr.New(bizerr.ErrCodeParams, "page is invalid")
	}
	return page, nil
}

func (s *BaseService) CheckAndSetPageSizeDefaultValue(pageSize int32) (int32, error) {
	if pageSize == 0 {
		return defaultPageSizeValue, nil
	}
	if pageSize < 0 || pageSize > 100 {
		return 0, bizerr.New(bizerr.ErrCodeParams, "pageSize is invalid")
	}

	return pageSize, nil
}

func (s *BaseService) CheckOrgIDAndProjectIDByClusterID(ctx context.Context, userContext *UserContext, clusterID uint64) (*core.Cluster, error) {
	cluster, err := grpcli.GetClusterByID(ctx, clusterID)
	if err != nil {
		return nil, err
	}
	err = userContext.CheckOrgIDAndProjectID(entity.ID(cluster.TenantId), entity.ID(cluster.ProjectId))
	if err != nil {
		return nil, err
	}
	return cluster, nil
}

func (s *BaseService) CheckName(name *string) error {
	if name == nil || *name == "" {
		return bizerr.New(bizerr.ErrCodeParams, "name is invalid")
	}
	pattern := `^[A-Za-z0-9][-A-Za-z0-9]{2,62}[A-Za-z0-9]$`
	reg := regexp.MustCompile(pattern)

	if reg.MatchString(*name) {
		return nil
	}
	return bizerr.New(bizerr.ErrCodeParams, "name is invalid")
}

func (s *BaseService) CheckDescription(desc *string) error {
	if desc == nil || *desc == "" {
		return nil
	}
	if len(*desc) > 256 {
		return bizerr.New(bizerr.ErrCodeParams, "desc is invalid")
	}
	return nil
}
