package maintenance

import (
	"context"

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

func (s *serverImpl) ListMaintenanceTasks(
	ctx context.Context,
	req *tidbmgmtservicev1.ListMaintenanceTasksRequest,
) (*tidbmgmtservicev1.ListMaintenanceTasksResponse, error) {
	ctx, span := tracer.Start(ctx, "ListMaintenanceTasks")
	defer span.End()
	if req.GetProjectId() == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "ProjectId is required")
	}

	tasks, err := s.mwSvc.ListMaintenanceTasks(ctx, req)
	if err != nil {
		return nil, err
	}
	return &tidbmgmtservicev1.ListMaintenanceTasksResponse{
		MaintenanceTasks: tasks.GetMaintenanceTasks(),
	}, nil
}

func (s *serverImpl) GetMaintenanceTask(
	ctx context.Context,
	req *tidbmgmtservicev1.GetMaintenanceTaskRequest,
) (*tidbmgmtservicev1.MaintenanceTask, error) {
	ctx, span := tracer.Start(ctx, "GetMaintenanceTask")
	defer span.End()
	if req.GetMaintenanceTaskId() == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "MaintenanceTaskId is required")
	}

	task, err := s.mwSvc.GetMaintenanceTask(ctx, req)
	if err != nil {
		return nil, err
	}
	return task, nil
}

func (s *serverImpl) UpdateMaintenanceTask(
	ctx context.Context,
	req *tidbmgmtservicev1.UpdateMaintenanceTaskRequest,
) (*tidbmgmtservicev1.MaintenanceTask, error) {
	ctx, span := tracer.Start(ctx, "UpdateMaintenanceTask")
	defer span.End()

	task, err := s.mwSvc.UpdateMaintenanceTask(ctx, req)
	if err != nil {
		return nil, err
	}
	return task, nil
}

func (s *serverImpl) QueryMaintenanceTasks(
	ctx context.Context,
	req *tidbmgmtservicev1.QueryMaintenanceTasksRequest,
) (*tidbmgmtservicev1.QueryMaintenanceTasksResponse, error) {
	ctx, span := tracer.Start(ctx, "QueryMaintenanceTasks")
	defer span.End()

	tasks, err := s.mwSvc.QueryMaintenanceTasks(ctx, req)
	if err != nil {
		return nil, err
	}
	return tasks, nil
}

func (s *serverImpl) CountMaintenanceTasks(
	ctx context.Context,
	req *tidbmgmtservicev1.CountMaintenanceTasksRequest,
) (*tidbmgmtservicev1.CountMaintenanceTasksResponse, error) {
	ctx, span := tracer.Start(ctx, "CountMaintenanceTasks")
	defer span.End()
	if req.Filter == nil {
		return nil, bizerr.New(bizerr.ErrCodeParams, "Filter is required")
	}

	count, err := s.mwSvc.CountMaintenanceTasks(ctx, req)
	if err != nil {
		return nil, err
	}
	return count, nil
}

func (s *serverImpl) CreateMaintenanceTask(
	ctx context.Context,
	req *tidbmgmtservicev1.CreateMaintenanceTaskRequest,
) (*tidbmgmtservicev1.MaintenanceTask, error) {
	ctx, span := tracer.Start(ctx, "CreateMaintenanceTask")
	defer span.End()
	if req.GetMaintenanceTask() == nil {
		return nil, bizerr.New(bizerr.ErrCodeParams, "MaintenanceTask is required")
	}

	task, err := s.mwSvc.CreateMaintenanceTask(ctx, req)
	if err != nil {
		return nil, err
	}
	return task, nil
}
