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) QueryMaintenanceTasks(
	ctx context.Context,
	req *tidbmgmtservicev1.QueryMaintenanceTasksRequest,
) (*tidbmgmtservicev1.QueryMaintenanceTasksResponse, bizerr.BizError) {
	ctx, span := tracer.Start(ctx, "QueryMaintenanceTaskSvc")
	defer span.End()

	if err := svc.checkQueryMaintenanceTasks(req); err != nil {
		return nil, err
	}

	tasks, _, err := svc.mtRepo.Query(
		ctx,
		req.GetFilter(),
		nil,
		nil,
		nil,
		nil,
		nil,
		nil,
	)
	if err != nil {
		if err.RawErrCode() == bizerr.ErrCodeRecordNotFound {
			return &tidbmgmtservicev1.QueryMaintenanceTasksResponse{}, nil
		}
		return nil, err
	}
	out := lo.Map(tasks, func(task *entity.MaintenanceTask, _ int) *tidbmgmtservicev1.MaintenanceTask {
		return &task.MaintenanceTask
	})

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

func (svc *service) checkQueryMaintenanceTasks(req *tidbmgmtservicev1.QueryMaintenanceTasksRequest) bizerr.BizError {
	filter := req.Filter

	if filter == nil ||
		(len(filter.ProjectIds) == 0 && len(filter.GetStates()) == 0 && len(filter.GetMaintenanceTaskIds()) == 0) {
		return bizerr.New(bizerr.ErrCodeParams, "filter is required")
	}

	return nil
}
