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.ExternalPersonService;
import org.eclipse.openk.contactbasedata.viewmodel.ExternalPersonDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
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.UUID;

@Log4j2
@RestController
@RequestMapping("/external-persons")
public class ExternalPersonController {
    @Autowired
    private ExternalPersonService externalPersonService;

    @GetMapping("/{contactUuid}")
    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
    @ApiOperation(value = "Anzeigen einer externen Person")
    @ApiResponses(value = { @ApiResponse(code = 200, message = "Erfolgreich durchgeführt"),
                            @ApiResponse(code = 404, message = "Person wurde nicht gefunden")})
    @ResponseStatus(HttpStatus.OK)
    public ExternalPersonDto getExternalPerson(@PathVariable UUID contactUuid) {
        return externalPersonService.findExternalPerson(contactUuid);
    }

    @GetMapping
    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
    @ApiOperation(value = "Anzeigen aller externen Personen", notes = "Sortieren ist möglich. Externe Personen werden seitenweise geliefert.")
    @ResponseStatus(HttpStatus.OK)
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
    public Page<ExternalPersonDto> readExternalPersons(
            @PageableDefault(sort = {"lastName"}, direction = Sort.Direction.ASC) Pageable pageable){
            return externalPersonService.findExternalPersons(pageable);
    }

    @PostMapping
    @Secured("ROLE_KON-ADMIN")
    @ApiOperation(value = "Anlegen einer externen Person")
    @ApiResponses(value = {
            @ApiResponse(code = 201, message = "externe Person erfolgreich angelegt"),
            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
    })
    public ResponseEntity<ExternalPersonDto> insertExternalPerson(
            @Validated @RequestBody ExternalPersonDto externalPersonDto) {
        ExternalPersonDto savedExternalPersonDto = externalPersonService.insertExternalPerson(externalPersonDto);
        URI location = ServletUriComponentsBuilder
                .fromCurrentRequestUri()
                .path("/{uuid}")
                .buildAndExpand(savedExternalPersonDto.getContactId())
                .toUri();
        return ResponseEntity.created(location).body(savedExternalPersonDto);
    }

    @PutMapping("/{contactUuid}")
    @Secured("ROLE_KON-ADMIN")
    @ApiOperation(value = "Ändern einer externen Person")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Externe Person wurde aktualisiert"),
            @ApiResponse(code = 400, message = "Ungültige Eingabe"),
            @ApiResponse(code = 404, message = "Nicht gefunden")})
    public ResponseEntity updateExternalPerson(@PathVariable UUID contactUuid, @Validated @RequestBody ExternalPersonDto externalPersonDto) {

        if (!externalPersonDto.getContactId().equals(contactUuid)) {
            throw new BadRequestException("invalid.uuid.path.object");
        }

        externalPersonService.updateExternalPerson(externalPersonDto);
        return ResponseEntity.ok().build();
    }
}

