package maintenancewindow

import (
	"context"

	"github.com/samber/lo"

	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func (svc *service) ListMaintenanceTasks(
	ctx context.Context,
	req *tidbmgmtservicev1.ListMaintenanceTasksRequest,
) (*tidbmgmtservicev1.ListMaintenanceTasksResponse, bizerr.BizError) {
	ctx, span := tracer.Start(ctx, "ListMaintenanceTaskSvc")
	defer span.End()

	if req.GetProjectId() == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "project_id is required")
	}

	tasks, _, err := svc.mtRepo.Query(
		ctx,
		&tidbmgmtservicev1.MaintenanceTaskFilter{ProjectIds: []uint64{req.GetProjectId()}},
		nil,
		nil,
		nil,
		nil,
		nil,
		nil,
	)
	if err != nil {
		if err.RawErrCode() == bizerr.ErrCodeRecordNotFound {
			return &tidbmgmtservicev1.ListMaintenanceTasksResponse{}, nil
		}
		return nil, err
	}

	out := lo.Map(tasks, func(task *entity.MaintenanceTask, _ int) *tidbmgmtservicev1.MaintenanceTask {
		return &task.MaintenanceTask
	})

	return &tidbmgmtservicev1.ListMaintenanceTasksResponse{MaintenanceTasks: out}, nil
}
