package importmodel

import (
	"context"

	"github.com/tidbcloud/dataflow-service/app/models/domain"
	importrepo "github.com/tidbcloud/dataflow-service/app/repo/import"
	"github.com/tidbcloud/pkgv2/bizerr"
)

type importModelImpl struct {
	importRepo importrepo.ImportRepo
}

// NewImportModelImpl creates a new import model implementation
func NewImportModelImpl(importRepo importrepo.ImportRepo) Model {
	return &importModelImpl{
		importRepo: importRepo,
	}
}

// ListImports lists imports according to the given request.
// It implements the interface in importmodel.Model
func (m *importModelImpl) List(
	ctx context.Context,
	req *domain.ListImportsReq,
) (*domain.ListImportsResp, bizerr.BizError) {
	impEnts, bizErr := m.importRepo.List(ctx, req.FilterOpsForList()...)
	if bizErr != nil {
		return nil, bizErr
	}
	var total int64
	if req.PerPage == 0 {
		// if there is no pagination, don't need to query db
		total = int64(len(impEnts))
	} else {
		total, bizErr = m.importRepo.Count(ctx, req.FilterOpsForCount()...)
		if bizErr != nil {
			return nil, bizErr
		}
	}
	imps := make([]*domain.ImportTask, 0)
	for _, impEnt := range impEnts {
		imps = append(imps, &domain.ImportTask{
			Import: impEnt,
		})
	}
	return &domain.ListImportsResp{
		Total:   uint32(total),
		Imports: imps,
	}, nil
}
