///*
// * Copyright 2015-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.xran.impl;
//
//import com.fasterxml.jackson.databind.JsonNode;
//import com.fasterxml.jackson.databind.node.ObjectNode;
//import com.google.common.collect.Lists;
//import org.apache.commons.lang3.tuple.ImmutablePair;
//import org.apache.felix.scr.annotations.Activate;
//import org.apache.felix.scr.annotations.Deactivate;
//import org.apache.felix.scr.annotations.Reference;
//import org.apache.felix.scr.annotations.ReferenceCardinality;
//import org.onlab.util.KryoNamespace;
//import org.onosproject.core.ApplicationId;
//import org.onosproject.core.CoreService;
//import org.onosproject.core.IdGenerator;
//import org.onosproject.store.AbstractStore;
//import org.onosproject.store.serializers.KryoNamespaces;
//import org.onosproject.store.service.ConsistentMap;
//import org.onosproject.store.service.Serializer;
//import org.onosproject.store.service.StorageService;
//import org.onosproject.store.service.Versioned;
//import org.onosproject.xran.XranStore;
//import org.onosproject.xran.codecs.api.ECGI;
//import org.onosproject.xran.codecs.api.ENBUES1APID;
//import org.onosproject.xran.codecs.api.MMEUES1APID;
//import org.onosproject.xran.codecs.pdu.CellConfigReport;
//import org.onosproject.xran.controller.XranController;
//import org.onosproject.xran.entities.RnibCell;
//import org.onosproject.xran.entities.RnibLink;
//import org.onosproject.xran.entities.RnibSlice;
//import org.onosproject.xran.entities.RnibUe;
//import org.onosproject.xran.identifiers.CellId;
//import org.onosproject.xran.identifiers.LinkId;
//import org.onosproject.xran.identifiers.SliceId;
//import org.onosproject.xran.identifiers.UeId;
//import org.slf4j.Logger;
//
//import java.util.List;
//
//import static org.slf4j.LoggerFactory.getLogger;
//
///**
// * Created by dimitris on 7/22/17.
// */
////@Component(immediate = true)
////@Service
//public class DistributedXranStore extends AbstractStore implements XranStore {
//    private static final String XRAN_APP_ID = "org.onosproject.xran";
//
//    private final Logger log = getLogger(getClass());
//
//    private ConsistentMap<LinkId, RnibLink> linkMap;
//    private ConsistentMap<CellId, RnibCell> cellMap;
//    private ConsistentMap<UeId, RnibUe> ueMap;
//    private ConsistentMap<SliceId, RnibSlice> sliceMap;
//
//    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
//    protected StorageService storageService;
//
//    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
//    protected CoreService coreService;
//
//    private IdGenerator cellIdGenerator;
//    private IdGenerator ueIdGenerator;
//    private IdGenerator linkIdGenerator;
//    private IdGenerator sliceIdGenerator;
//
//    private XranController controller;
//
//    private final String XRAN_CELL_ID = "xran-cell-ids";
//    private final String XRAN_UE_ID = "xran-eu-ids";
//    private final String XRAN_LINK_ID = "xran-link-ids";
//    private final String XRAN_SLICE_ID = "xran-slice-ids";
//
//    @Activate
//    public void activate() {
//        ApplicationId appId = coreService.getAppId(XRAN_APP_ID);
//
//        cellIdGenerator = coreService.getIdGenerator(XRAN_CELL_ID);
//        ueIdGenerator = coreService.getIdGenerator(XRAN_UE_ID);
//        linkIdGenerator = coreService.getIdGenerator(XRAN_LINK_ID);
//        sliceIdGenerator = coreService.getIdGenerator(XRAN_SLICE_ID);
//
//        KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
//                .register(KryoNamespaces.API)
//                .register(RnibCell.class)
//                .register(RnibSlice.class)
//                .register(RnibUe.class)
//                .register(RnibLink.class)
//                .register(LinkId.class)
//                .register(CellId.class)
//                .register(UeId.class)
//                .register(SliceId.class)
//                .register(ImmutablePair.class)
//                .register(ENBUES1APID.class)
//                .register(MMEUES1APID.class)
//                .register(CellConfigReport.class)
//                .register(ECGI.class);
//
//        linkMap = storageService.<LinkId, RnibLink>consistentMapBuilder()
//                .withSerializer(Serializer.using(serializer.build()))
//                .withName("xran-link-map")
//                .withApplicationId(appId)
//                .withPurgeOnUninstall()
//                .build();
//
//        cellMap = storageService.<CellId, RnibCell>consistentMapBuilder()
//                .withSerializer(Serializer.using(serializer.build()))
//                .withName("xran-cell-map")
//                .withApplicationId(appId)
//                .withPurgeOnUninstall()
//                .build();
//
//        ueMap = storageService.<UeId, RnibUe>consistentMapBuilder()
//                .withSerializer(Serializer.using(serializer.build()))
//                .withName("xran-ue-map")
//                .withApplicationId(appId)
//                .withPurgeOnUninstall()
//                .build();
//
//        sliceMap = storageService.<SliceId, RnibSlice>consistentMapBuilder()
//                .withSerializer(Serializer.using(serializer.build()))
//                .withName("xran-slice-map")
//                .withApplicationId(appId)
//                .withPurgeOnUninstall()
//                .build();
//
//        log.info("XRAN Distributed Store Started");
//    }
//
//    @Deactivate
//    public void deactive() {
//        log.info("XRAN Distributed Store Stopped");
//    }
//
//    @Override
//    public List<RnibLink> getlinksbycellid(long cellId) {
//        List<RnibLink> list = Lists.newArrayList();
//        CellId cell = CellId.valueOf(cellId);
//        linkMap.keySet().forEach(
//                pair -> {
//                    if (pair.equals(cell)) {
//                        list.add(linkMap.get(pair).value());
//                    }
//                }
//        );
//        return list;
//    }
//
//    @Override
//    public List<RnibLink> getlinksbyueid(long euId) {
//        List<RnibLink> list = Lists.newArrayList();
//        UeId ue = UeId.valueOf(euId);
//        linkMap.keySet().forEach(
//                pair -> {
//                    if (pair.equals(ue)) {
//                        list.add(linkMap.get(pair).value());
//                    }
//                }
//        );
//        return list;
//    }
//
//    @Override
//    public RnibLink getlinkbetweencellidueid(long cellId, long euId) {
//        LinkId linkId = LinkId.valueOf(cellId, euId);
//        final Versioned<RnibLink> rnibLinkVersioned = linkMap.get(linkId);
//        if (rnibLinkVersioned != null) {
//            return rnibLinkVersioned.value();
//        }
//        return null;
//    }
//
//    @Override
//    public boolean modifyTypeOfLink(long cellId, long euId, String type) {
//        final RnibLink link = getlinkbetweencellidueid(cellId, euId);
//        if (link != null) {
//            link.setType(type);
//            return true;
//        }
//        return false;
//    }
//
//    @Override
//    public boolean modifyTrafficPercentOfLink(long cellId, long euId, long trafficPercent) {
//        final RnibLink link = getlinkbetweencellidueid(cellId, euId);
//        if (link != null) {
//            link.setTrafficPercent(trafficPercent);
//            return true;
//        }
//        return false;
//    }
//
//    @Override
//    public boolean createLinkBetweenCellIdUeId(long cellId, long euId, String type) {
//        LinkId linkId = LinkId.valueOf(cellId, euId);
//        if (linkMap.containsKey(linkId)) {
//            return false;
//        }
//        RnibLink link = new RnibLink(linkId);
//        link.setType(type);
//        linkMap.putPrimaryLink(linkId, link);
//        return true;
//    }
//
//    @Override
//    public boolean deleteLink(long linkId) {
//        return false;
//    }
//
//    @Override
//    public List<Object> getNodes() {
//        List<Object> list = Lists.newArrayList();
//        cellMap.values().forEach(v -> list.add(v.value()));
//        ueMap.values().forEach(v -> list.add(v.value()));
//        return list;
//    }
//
//    @Override
//    public List<RnibCell> getcellnodes() {
//        List<RnibCell> list = Lists.newArrayList();
//        cellMap.values().forEach(v -> list.add(v.value()));
//        return list;
//    }
//
//    @Override
//    public List<RnibUe> getuenodes() {
//        List<RnibUe> list = Lists.newArrayList();
//        ueMap.values().forEach(v -> list.add(v.value()));
//        return list;
//    }
//
//    @Override
//    public Object getbynodeid(long nodeId) {
//        CellId cellId = CellId.valueOf(nodeId);
//        if (cellMap.containsKey(cellId)) {
//            return cellMap.get(cellId).value();
//        }
//        UeId ueId = UeId.valueOf(nodeId);
//        if (ueMap.containsKey(ueId)) {
//            return ueMap.get(ueId).value();
//        }
//        return null;
//    }
//
//    @Override
//    public void storeCell(RnibCell cell) {
//        final CellId cellId = CellId.valueOf(cellIdGenerator.getNewId());
//        cell.setCellId(cellId);
//        cellMap.putIfAbsent(cellId, cell);
//    }
//
//    @Override
//    public RnibCell getCell(long cellId) {
//        CellId cell = CellId.valueOf(cellId);
//        if (cellMap.containsKey(cell)) {
////            controller.sendMsg(cellMap.get(cell).value().getDevId(), "skata");
//            return cellMap.get(cell).value();
//        }
//        return null;
//    }
//
//    @Override
//    public boolean modifycellrrmconf(JsonNode rrmConf) {
//        return false;
//    }
//
//    @Override
//    public RnibSlice getSlice(long sliceId) {
//        SliceId slice = SliceId.valueOf(sliceId);
//        if (sliceMap.containsKey(slice)) {
//            return sliceMap.get(slice).value();
//        }
//        return null;
//    }
//
//    @Override
//    public boolean createSlice(ObjectNode attributes) {
//        return false;
//    }
//
//    public XranController getController() {
//        return controller;
//    }
//
//    @Override
//    public void storeUe(RnibUe ue) {
//        final UeId ueId = UeId.valueOf(ueIdGenerator.getNewId());
//        ue.setUeId(ueId);
//        ueMap.putIfAbsent(ueId, ue);
//    }
//
//    public void setController(XranController controller) {
//        this.controller = controller;
//    }
//}
