/*-
 * ============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.common.dto.AccessPodDTO;
import org.onap.osam.helper.DTOMapper;
import org.onap.osam.model.dao.AccessPod;
import org.onap.osam.api.service.AccessPodService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Created by cemturker on 27.09.2018.
 */
@RestController
@RequestMapping("/accessPod")
@Slf4j
public class AccessPodRestController extends AbstractController {

    private AccessPodService accessPodService;

    @Autowired
    public AccessPodRestController(AccessPodService accessPodService) {
        super(log);
        this.accessPodService = accessPodService;
    }

    @GetMapping
    public List<AccessPodDTO> getAccessPods(){
        return DTOMapper.covertAccessPodsToDtos(accessPodService.getAll());
    }

    @PostMapping
    public ResponseEntity<AccessPodDTO> postAccessPod(@RequestBody AccessPodDTO accessPodDTO){
        try {
            log.info("Post request for {} is received",accessPodDTO);
            AccessPod accessPod = DTOMapper.convertDtoToAccessPod(accessPodDTO);
            accessPod = accessPodService.addOrUpdate(accessPod);
            return new ResponseEntity<>(DTOMapper.convertAccessPodToDto(accessPod),HttpStatus.CREATED);
        }catch (Exception e){
            return super.proceedException(e);
        }
    }

    @DeleteMapping("pnf/{pnfId}")
    public ResponseEntity deleteAccessPodByPnfId(@PathVariable("pnfId") String pnfId) {
        try{
            this.accessPodService.removeByPnfId(pnfId);
            return ResponseEntity.ok().build();
        }catch (Exception e) {
            return super.proceedException(e);
        }

    }

    @DeleteMapping("/{id}")
    public ResponseEntity deleteAccessPod(@PathVariable("id") Long id) {
        try {
            this.accessPodService.removeById(id);
        }catch (Exception e) {
            return super.proceedException(e);
        }
        return ResponseEntity.ok().build();
    }

}
