/*
 * Copyright 2017-present Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.onosproject.incubator.protobuf.services.nb;

import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onosproject.net.meter.MeterService;
import org.onosproject.incubator.protobuf.models.net.meter.MeterProtoTranslator;

import org.onosproject.grpc.nb.net.meter.MeterServiceGrpc.MeterServiceImplBase;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.submitRequest;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.submitReply;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.withdrawRequest;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.withdrawReply;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getMeterRequest;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getMeterReply;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getAllMetersRequest;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getAllMetersReply;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getMetersRequest;
import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getMetersReply;

import io.grpc.stub.StreamObserver;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Deactivate;
import com.google.common.annotations.Beta;
import org.apache.felix.scr.annotations.Component;

import org.onosproject.net.meter.Meter;
import org.onosproject.net.meter.MeterId;
import org.onosproject.net.DeviceId;
import org.onosproject.protobuf.api.GrpcServiceRegistry;

/**
 * A server that provides access to the methods exposed by {@link MeterService}.
 * TODO this requires major refactoring, translation should be delegated to calls to
 * TODO{@link MeterProtoTranslator}.
 */
@Beta
@Component(immediate = true)
public class GrpcNbMeterService extends MeterServiceImplBase {

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected MeterService meterService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected GrpcServiceRegistry grpcServiceRegistry;

    @Activate
    public void activate() {
        grpcServiceRegistry.register(this);
    }

    @Deactivate
    public void deactivate() {
        grpcServiceRegistry.unregister(this);
    }

    @Override
    public void submit(submitRequest request,
                       StreamObserver<submitReply> responseObserver) {
        submitReply.Builder replyBuilder = submitReply.newBuilder();
        Meter meter = meterService.submit(MeterProtoTranslator.translate(request.getMeter()));
        responseObserver.onNext(replyBuilder.setSubmitMeter(MeterProtoTranslator.translate(meter)).build());
        responseObserver.onCompleted();
    }

    @Override
    public void withdraw(withdrawRequest request,
                         StreamObserver<withdrawReply> responseObserver) {
        withdrawReply.Builder replyBuilder = withdrawReply.newBuilder();
        meterService.withdraw(MeterProtoTranslator.translate(request.getMeter()),
                MeterId.meterId(request.getMeterId()));
        responseObserver.onNext(replyBuilder.build());
        responseObserver.onCompleted();
    }

    @Override
    public void getMeter(getMeterRequest request,
                         StreamObserver<getMeterReply> responseObserver) {
        getMeterReply.Builder replyBuilder = getMeterReply.newBuilder();
        Meter meter = meterService.getMeter(DeviceId.deviceId(request.getDeviceId()),
                MeterId.meterId(request.getMeterId()));
        responseObserver.onNext(replyBuilder.setMeter(MeterProtoTranslator.translate(meter)).build());
        responseObserver.onCompleted();
    }

    @Override
    public void getAllMeters(getAllMetersRequest request,
                             StreamObserver<getAllMetersReply> responseObserver) {
        getAllMetersReply.Builder replyBuilder = getAllMetersReply.newBuilder();
        meterService.getAllMeters().forEach(d -> {
            replyBuilder.addMeters(MeterProtoTranslator.translate(d));
        });
        responseObserver.onNext(replyBuilder.build());
        responseObserver.onCompleted();
    }

    @Override
    public void getMeters(getMetersRequest request,
                          StreamObserver<getMetersReply> responseObserver) {
        getMetersReply.Builder replyBuilder = getMetersReply.newBuilder();
        meterService.getMeters(DeviceId.deviceId(request.getDeviceId())).forEach(d -> {
            replyBuilder.addMeters(MeterProtoTranslator.translate(d));
        });
        responseObserver.onNext(replyBuilder.build());
        responseObserver.onCompleted();
    }

}

