/*-
 * ============LICENSE_START=======================================================
 * OSAM Core
 * ================================================================================
 * Copyright (C) 2018 Netsia
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */



package org.onap.osam.controller;

import lombok.extern.slf4j.Slf4j;
import org.onap.osam.api.service.AccessPodService;
import org.onap.osam.api.service.DeviceService;
import org.onap.osam.common.dto.AccessPodDTO;
import org.onap.osam.helper.DTOMapper;
import org.onap.osam.model.dao.AccessPod;
import org.onap.osam.model.dao.Chassis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Created by cemturker on 03.10.2018.
 */
@RestController
@RequestMapping("topology")
@Slf4j
public class TopologyController extends AbstractController {
    private AccessPodService accessPodService;
    private DeviceService deviceService;

    @Autowired
    public TopologyController(AccessPodService accessPodService,
                              DeviceService deviceService) {
        super(log);
        this.accessPodService = accessPodService;
        this.deviceService = deviceService;
    }

    @GetMapping("/accessPod/{pnfId}")
    public ResponseEntity<AccessPodDTO> getTopologyWithPnfId(@PathVariable("pnfId") String pnfId) {
        try{
            log.info("GetTopology with pnfId:{} is received.",pnfId);
            AccessPod accessPod = accessPodService.findByPnfId(pnfId);
            List<Chassis> chassisList = deviceService.getByPnfId(pnfId);
            return ResponseEntity.ok(DTOMapper.representTheAccessPod(chassisList,accessPod));
        }catch (Exception e) {
            return super.proceedException(e);
        }
    }
}
