/*-
 * ============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.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();
    }

}
