package maintenance

import (
	"context"

	"google.golang.org/protobuf/types/known/emptypb"

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

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

	mws, err := s.mwSvc.ListMaintenanceWindows(ctx, req)
	if err != nil {
		return nil, err
	}
	return &tidbmgmtservicev1.ListMaintenanceWindowsResponse{
		MaintenanceWindows: mws.GetMaintenanceWindows(),
	}, nil
}

func (s *serverImpl) GetMaintenanceWindow(
	ctx context.Context,
	req *tidbmgmtservicev1.GetMaintenanceWindowRequest,
) (*tidbmgmtservicev1.MaintenanceWindow, error) {
	ctx, span := tracer.Start(ctx, "GetMaintenanceWindow")
	defer span.End()
	if req.GetMaintenanceWindowId() == "" {
		return nil, bizerr.New(bizerr.ErrCodeParams, "MaintenanceWindowId is required")
	}

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

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

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

func (s *serverImpl) SyncMaintenanceWindow(
	ctx context.Context,
	req *tidbmgmtservicev1.SyncMaintenanceWindowRequest,
) (*emptypb.Empty, error) {
	ctx, span := tracer.Start(ctx, "SyncMaintenanceWindows")
	defer span.End()

	return s.mwSvc.SyncMaintenanceWindow(ctx, req)
}
