package org.eclipse.openk.contactbasedata.controller;

import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.log4j.Log4j2;
import org.eclipse.openk.contactbasedata.exceptions.BadRequestException;
import org.eclipse.openk.contactbasedata.service.CommunicationTypeService;;
import org.eclipse.openk.contactbasedata.viewmodel.CommunicationTypeDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.net.URI;
import java.util.List;
import java.util.UUID;

@Log4j2
@RestController
@RequestMapping("/communication-types")
public class CommunicationTypeController {
    @Autowired
    private CommunicationTypeService communicationTypeService;


    @GetMapping("/{communicationTypeUuid}")
    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
    @ApiOperation(value = "Anzeigen eines Kommunikationstyps")
    @ApiResponses(value = { @ApiResponse(code = 200, message = "Erfolgreich durchgeführt"),
                            @ApiResponse(code = 404, message = "Person wurde nicht gefunden")})
    @ResponseStatus(HttpStatus.OK)
    public CommunicationTypeDto getCommunicationType(@PathVariable UUID communicationTypeUuid) {
        return communicationTypeService.findCommunicationType(communicationTypeUuid);
    }

    @GetMapping
    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
    @ApiOperation(value = "Anzeigen aller Kommunikationstypen")
    @ResponseStatus(HttpStatus.OK)
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
    public List<CommunicationTypeDto> getCommunicationTypes(){
            return communicationTypeService.findCommunicationTypes();
    }

    @PostMapping
    @Secured({"ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
    @ApiOperation(value = "Anlegen eines Kommunikationstyps")
    @ApiResponses(value = {
            @ApiResponse(code = 201, message = "Kommunikationstyp erfolgreich angelegt"),
            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
    })
    public ResponseEntity<CommunicationTypeDto> insertCommunicationType(
            @Validated @RequestBody CommunicationTypeDto communicationTypeDto) {
        CommunicationTypeDto savedCommunicationTypeDto = communicationTypeService.insertCommunicationType(communicationTypeDto);
        URI location = ServletUriComponentsBuilder
                .fromCurrentRequestUri()
                .path("/{uuid}")
                .buildAndExpand(savedCommunicationTypeDto.getUuid())
                .toUri();
        return ResponseEntity.created(location).body(savedCommunicationTypeDto);
    }

    @PutMapping("/{uuid}")
    @Secured({"ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
    @ApiOperation(value = "Ändern eines Kommunikationstyps")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Kommunikationstyp wurde aktualisiert"),
            @ApiResponse(code = 400, message = "Ungültige Eingabe"),
            @ApiResponse(code = 404, message = "Nicht gefunden")})
    public ResponseEntity updateCommunicationType(@PathVariable UUID uuid, @Validated @RequestBody CommunicationTypeDto communicationTypeDto) {

        if (!communicationTypeDto.getUuid().equals(uuid)) {
            throw new BadRequestException("invalid.uuid.path.object");
        }

        communicationTypeService.updateCommunicationType(communicationTypeDto);
        return ResponseEntity.ok().build();
    }

    @DeleteMapping("/{uuid}")
    @Secured({"ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
    @ResponseStatus(HttpStatus.OK)
    @ApiOperation(value = "Kommunikationstyp löschen")
    @ApiResponses(value = {
            @ApiResponse(code = 204, message = "Erfolgreich durchgeführt"),
            @ApiResponse(code = 400, message = "Ungültige Anfrage"),
            @ApiResponse(code = 404, message = "Nicht gefunden")})
    public void removeComunicationType(@PathVariable UUID uuid) {
        communicationTypeService.removeCommunicationType(uuid);
    }
}

