package backup

import (
	"context"

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

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	brsvc "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/service/br"
)

func NewServer(
	svc brsvc.Service,
) globalngv1.BackupServiceServer {
	return &server{
		Service: svc,
	}
}

type server struct {
	brsvc.Service
}

func (s *server) ListBackups(
	ctx context.Context,
	req *globalngv1.ListBackupsRequest,
) (*globalngv1.ListBackupsResponse, error) {
	resp, err := s.Service.ListBackups(ctx, req)
	if err != nil {
		return nil, err
	}
	return resp, nil
}

func (s *server) DeleteBackup(
	ctx context.Context,
	req *globalngv1.DeleteBackupRequest,
) (*emptypb.Empty, error) {
	backup := &globalngv1.Backup{
		Id:             req.GetBackupId(),
		OrganizationId: req.GetOrganizationId(),
	}
	err := s.Service.DeleteBackup(ctx, backup)
	if err != nil {
		return nil, err
	}
	return &emptypb.Empty{}, nil
}

func (s *server) ListNotCleanupBackupSettings(
	ctx context.Context,
	req *globalngv1.ListNotCleanupBackupSettingsRequest,
) (*globalngv1.ListNotCleanupBackupSettingsResponse, error) {
	backupSettings, err := s.Service.ListNotCleanupBackupSettings(ctx, req)
	if err != nil {
		return nil, err
	}
	return backupSettings, nil
}

func (s *server) BatchUpdateBackupSettingNames(
	ctx context.Context,
	req *globalngv1.BatchUpdateBackupSettingNamesRequest,
) (*emptypb.Empty, error) {
	if err := s.Service.BatchUpdateBackupSettingNames(ctx, req); err != nil {
		return nil, err
	}
	return &emptypb.Empty{}, nil
}

func (s *server) ListBackupPolicies(
	ctx context.Context,
	req *globalngv1.ListBackupPoliciesRequest,
) (*globalngv1.ListBackupPoliciesResponse, error) {
	backupPolicies, err := s.Service.ListBackupPolicies(ctx, req)
	if err != nil {
		return nil, err
	}
	return backupPolicies, nil
}

func (s *server) CreateManualBackup(
	ctx context.Context,
	req *globalngv1.CreateManualBackupRequest,
) (*globalngv1.CreateManualBackupResponse, error) {
	resp, err := s.Service.CreateManualBackup(ctx, req)
	if err != nil {
		return nil, err
	}
	return resp, nil
}

func (s *server) CreateFinalBackup(
	ctx context.Context,
	req *globalngv1.CreateFinalBackupRequest,
) (*globalngv1.CreateFinalBackupResponse, error) {
	return s.Service.CreateFinalBackup(ctx, req)
}

func (s *server) OverrideFlexibleBackupRetention(
	ctx context.Context,
	req *globalngv1.OverrideFlexibleBackupRetentionRequest,
) (*globalngv1.BackupSetting, error) {
	return s.Service.OverrideFlexibleBackupRetention(ctx, req)
}
