//go:generate ${GOBIN}/mockgen -destination tenant_service_mock.go -package=tenant ${GO_MODULE}/pkg/service/tenant TenantServiceAPI
package tenant

import (
	"context"

	tntent "github.com/tidbcloud/devops/entity/tenant"
	"github.com/tidbcloud/devops/pkg/infra/clients/accountcli"
)

type SortByType string
type OrderType string

const (
	SortByTypeCreatedAt SortByType = "created_at"
	SortByTypeTimezone  SortByType = "timezone"
	OrderTypeASC        OrderType  = "asc"
	OrderTypeDESC       OrderType  = "desc"
)

type ListTenantsParam struct {
	Filter ListTenantsFilter
	Search string

	SortBy  SortByType
	Order   OrderType
	Page    int
	PerPage int
}

type ListTenantsFilter struct {
	ID              []uint64
	Status          []tntent.TenantStatus
	Kind            []tntent.TenantKind
	SalesOwnerEmail []string
	Plan            []tntent.TenantPlan
	Region          []tntent.TenantRegion
	Segmentation    []tntent.TenantSegmentation
}

type TenantServiceAPI interface {
	ListTenants(ctx context.Context, param ListTenantsParam) ([]*tntent.Tenant, int64, error)
	GetTenant(ctx context.Context, tenantID uint64) (*tntent.Tenant, error)
	UpdateTenant(ctx context.Context, req *accountcli.UpdateTenantReq, tenantID, applicant string) error
	DeleteTenant(ctx context.Context, tenantID uint64, applicant string) error
	SyncTenants(ctx context.Context) error

	GetProject(ctx context.Context, projectID uint64) (*accountcli.Project, error)
	DeleteProjectByID(ctx context.Context, tenantID, projectID, applicant string) error
	AddUserToTenant(ctx context.Context, tenantID, userID, orgRole, applicant string) error
	AddUserToProject(ctx context.Context, tenantID, projectID, userID, projectRole, applicant string) error
	RemoveUserFromTenant(ctx context.Context, tenantID, userID, applicant string) error
	RemoveUserFromProject(ctx context.Context, tenantID, projectID, userID, applicant string) error
	DeleteUser(ctx context.Context, userID, applicant string) error
	GetTenantUsers(ctx context.Context, tenantID string, query accountcli.GetUsersReq, applicant string) (*accountcli.GetUsersResp, error)
	GetProjectUsers(ctx context.Context, tenantID, projectID string, query accountcli.GetUsersReq, applicant string) (*accountcli.GetUsersResp, error)

	AddImpersonate(ctx context.Context, userEmail string, tenantID uint64) error
	GetImpersonate(ctx context.Context, userEmail string) (*uint64, error)
	DeleteImpersonate(ctx context.Context, userEmail string) error

	MetricsAdvancedQueryRange(ctx context.Context, query string, start, end, step int64) (*tntent.MetricsQueryData, error)
}
