package domain

import (
	"github.com/tidbcloud/core-svc/idl/pbgen/proto/core"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
	importrepo "github.com/tidbcloud/dataflow-service/app/repo/import"
	"github.com/tidbcloud/dataflow-service/pkg/account/accounttypes"
)

// ImportTask is the entity object to manipulate in model.
type ImportTask struct {
	entity.Import
	// Cluster stores the cluster information for the imported cluster.
	Cluster *core.Cluster
	// Tenant stores the tenant information for the imported cluster.
	Tenant *accounttypes.Tenant
}

type ListImportsReq struct {
	Page      uint32
	PerPage   uint32
	ClusterID uint64
	Statuses  []entity.ImportStatus
}

func (r *ListImportsReq) FilterOpsForList() []importrepo.ImportFilterOp {
	result := make([]importrepo.ImportFilterOp, 0)
	if r.ClusterID > 0 {
		clusterFilterOp := func(qs entity.ImportQuerySet) entity.ImportQuerySet {
			return qs.ClusterIDEq(entity.ID(r.ClusterID))
		}
		result = append(result, clusterFilterOp)
	}
	if len(r.Statuses) > 0 {
		statusFilterOp := func(qs entity.ImportQuerySet) entity.ImportQuerySet {
			return qs.StatusIn(r.Statuses...)
		}
		result = append(result, statusFilterOp)
	}
	descOrderOp := func(qs entity.ImportQuerySet) entity.ImportQuerySet {
		return qs.OrderDescByCreatedAt()
	}
	result = append(result, descOrderOp)
	if r.PerPage > 0 && r.Page > 0 {
		offset := int((r.Page - 1) * r.PerPage)
		limit := int(r.PerPage)
		offsetLimitOp := func(qs entity.ImportQuerySet) entity.ImportQuerySet {
			return qs.Offset(offset).Limit(limit)
		}
		result = append(result, offsetLimitOp)
	}
	return result
}

func (r *ListImportsReq) FilterOpsForCount() []importrepo.ImportFilterOp {
	result := make([]importrepo.ImportFilterOp, 0)
	if r.ClusterID > 0 {
		clusterFilterOp := func(qs entity.ImportQuerySet) entity.ImportQuerySet {
			return qs.ClusterIDEq(entity.ID(r.ClusterID))
		}
		result = append(result, clusterFilterOp)
	}
	if len(r.Statuses) > 0 {
		statusFilterOp := func(qs entity.ImportQuerySet) entity.ImportQuerySet {
			return qs.StatusIn(r.Statuses...)
		}
		result = append(result, statusFilterOp)
	}
	return result
}

type ListImportsResp struct {
	Total   uint32
	Imports []*ImportTask
}
