/*
 * 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;

/**
 * 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 {

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

    @Activate
    public void activate() {
        //TODO this should contact the registry service and register an instance
        // of this service.
    }

    @Deactivate
    public void deactivate() {
    }

    private class MeterServiceNbServerInternal extends MeterServiceImplBase {

        public MeterServiceNbServerInternal() {
            super();
        }

        @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();
        }
    }
}

