/*
* 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 com.google.common.annotations.Beta;
import io.grpc.BindableService;
import io.grpc.stub.StreamObserver;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.onosproject.grpc.nb.net.region.RegionServiceGrpc.RegionServiceImplBase;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionDevicesReply;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionDevicesRequest;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionForDeviceReply;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionForDeviceRequest;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionHostsReply;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionHostsRequest;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionReply;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionRequest;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionsReply;
import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionsRequest;
import org.onosproject.incubator.protobuf.models.net.RegionProtoTranslator;
import org.onosproject.net.DeviceId;
import org.onosproject.net.region.Region;
import org.onosproject.net.region.RegionId;
import org.onosproject.net.region.RegionService;
import org.onosproject.protobuf.api.GrpcServiceRegistry;
import org.slf4j.Logger;

import static org.slf4j.LoggerFactory.getLogger;

/**
 * A server that provides access to the methods exposed by {@link RegionService}.
 */
@Beta
@Component(immediate = true)
public class GrpcNbRegionService {

    private final Logger log = getLogger(getClass());

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected GrpcServiceRegistry registry;

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected RegionService regionService;

    private RegionServiceNbServerInternal innerClassInstance = null;

    @Activate
    public void activate() {

        registry.register(getInnerClassInstance());
        log.info("Started.");
    }

    @Deactivate
    public void deactivate() {

        registry.unregister(getInnerClassInstance());
        log.info("Stopped.");
    }

    /**
     * Register Region Service, used for unit testing purposes.
     *
     * @return An instance of binding Region service
     */
    public InProcessServer<BindableService> registerInProcessServer() {
        InProcessServer<BindableService> inprocessServer =
                new InProcessServer(GrpcNbRegionService.RegionServiceNbServerInternal.class);
        inprocessServer.addServiceToBind(getInnerClassInstance());

        return inprocessServer;
    }

    private final class RegionServiceNbServerInternal extends RegionServiceImplBase {
        /**
         * Service for interacting with inventory of network control regions.
         */
        @Override
        public void getRegions(getRegionsRequest request,
                               StreamObserver<getRegionsReply> responseObserver) {
            getRegionsReply.Builder builder = getRegionsReply.newBuilder();
            regionService.getRegions().forEach(r -> {
                builder.addRegion(RegionProtoTranslator.translate(r));
            });
            responseObserver.onNext(builder.build());
            responseObserver.onCompleted();
        }

        @Override
        public void getRegion(getRegionRequest request,
                              StreamObserver<getRegionReply> responseObserver) {
            RegionId regionId = RegionId.regionId(request.getRegionId());
            Region region = regionService.getRegion(regionId);

            getRegionReply reply = getRegionReply.newBuilder()
                    .setRegion(RegionProtoTranslator.translate(region)).build();

            responseObserver.onNext(reply);
            responseObserver.onCompleted();
        }

        @Override
        public void getRegionForDevice(getRegionForDeviceRequest request,
                                       StreamObserver<getRegionForDeviceReply> responseObserver) {
            DeviceId deviceId = DeviceId.deviceId(request.getDeviceId());
            Region region = regionService.getRegionForDevice(deviceId);

            getRegionForDeviceReply reply = getRegionForDeviceReply.newBuilder()
                    .setRegion(RegionProtoTranslator.translate(region)).build();

            responseObserver.onNext(reply);
            responseObserver.onCompleted();
        }

        @Override
        public void getRegionDevices(getRegionDevicesRequest request,
                                     StreamObserver<getRegionDevicesReply> responseObserver) {
            RegionId regionId = RegionId.regionId(request.getRegionId());
            getRegionDevicesReply.Builder builder = getRegionDevicesReply.newBuilder();

            regionService.getRegionDevices(regionId).forEach(d -> {
                builder.addDeviceId(d.toString());
            });

            responseObserver.onNext(builder.build());
            responseObserver.onCompleted();
        }

        @Override
        public void getRegionHosts(getRegionHostsRequest request,
                                   StreamObserver<getRegionHostsReply> responseObserver) {
            RegionId regionId = RegionId.regionId(request.getRegionId());
            getRegionHostsReply.Builder builder = getRegionHostsReply.newBuilder();

            regionService.getRegionHosts(regionId).forEach(h -> {
                builder.addHostId(h.toString());
            });

            responseObserver.onNext(builder.build());
            responseObserver.onCompleted();
        }
    }

    private RegionServiceNbServerInternal getInnerClassInstance() {
        if (innerClassInstance == null) {
            innerClassInstance = new RegionServiceNbServerInternal();
        }
        return innerClassInstance;
    }
}







