/*
 *******************************************************************************
 * Copyright (c) 2019 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************
 */
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.AssignmentModulContactService;
import org.eclipse.openk.contactbasedata.viewmodel.AssignmentModulContactDto;
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("/contacts")
public class AssignmentModulContactController {
    @Autowired
    private AssignmentModulContactService assignmentModulContactService;

    @GetMapping ("/{contactUuid}/assignments")
    @Secured({"ROLE_KON-READER", "ROLE_KON-WRITER", "ROLE_KON-ADMIN"})
    @ApiOperation(value = "Anzeigen aller Zuordnungen Kontakt:Modul")
    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Ungültige Anfrage."),
            @ApiResponse(code = 200, message = "Suche durchgeführt")})
    @ResponseStatus(HttpStatus.OK)
    public List<AssignmentModulContactDto> getAssignment(
             @PathVariable UUID contactUuid) {
        return assignmentModulContactService.getAssignments(contactUuid);
    }

    @GetMapping("/{contactUuid}/assignments/{assignmentUuid}")
    @ApiOperation(value = "Lesen einer Zuordnung Kontakt:Modul")
    @ApiResponses(value = {
            @ApiResponse(code = 404, message = "Zuordnung nicht gefunden."),
            @ApiResponse(code = 400, message = "Ungültige Anfrage."),
            @ApiResponse(code = 200, message = "Zuordnung erfolgreich ermittelt.")})
    public AssignmentModulContactDto getAssignment(
            @PathVariable UUID contactUuid,
            @PathVariable UUID assignmentUuid) {
        return assignmentModulContactService.getAssignment(contactUuid, assignmentUuid);
    }


    @PostMapping("/{contactUuid}/assignments")
    @ApiOperation(value = "Anlegen einer neuen Zuordnung Kontakt:Modul")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Zuordnung erfolgreich angelegt"),
            @ApiResponse(code = 500, message = "Konnte nicht durchgeführt werden")
    })
    public ResponseEntity<AssignmentModulContactDto> insertAssignment(
            @PathVariable UUID contactUuid,
            @Validated @RequestBody AssignmentModulContactDto assignmentModulContactDto) {
        if (!contactUuid.equals(assignmentModulContactDto.getContactUuid())) {
            throw new BadRequestException("invalid.uuid.path.object");
        }
        AssignmentModulContactDto savedAssignment = assignmentModulContactService.insertAssignment(contactUuid, assignmentModulContactDto);
        URI location = ServletUriComponentsBuilder
                .fromCurrentRequestUri()
                .path("/{uuid}")
                .buildAndExpand(savedAssignment.getUuid())
                .toUri();
        return ResponseEntity.created(location).body(savedAssignment);
    }


    @PutMapping("/{contactUuid}/assignments/{assignmentUuid}")
    @ApiOperation(value = "Ändern einer Zuordnung Kontakt:Modul")
    @ApiResponses(value = {
            @ApiResponse(code = 404, message = "Zuordnung nicht gefunden."),
            @ApiResponse(code = 400, message = "Ungültige Anfrage."),
            @ApiResponse(code = 200, message = "Zuordnung erfolgreich geändert.")})
    public ResponseEntity updateAssignment(
            @PathVariable UUID contactUuid,
            @PathVariable UUID assignmentUuid,
            @Validated @RequestBody AssignmentModulContactDto assignmentDto) {
        if (!assignmentUuid.equals(assignmentDto.getUuid())) {
            throw new BadRequestException("invalid.uuid.path.object");
        }
        assignmentModulContactService.updateAssignment(contactUuid, assignmentDto);
        return ResponseEntity.ok().build();
    }

    @DeleteMapping("{contactUuid}/assignments/{assignmentUuid}")
    @ResponseStatus(HttpStatus.OK)
    @ApiOperation(value = "Eine bestimmte Zuordnung eines bestimmten Kontakts löschen")
    @ApiResponses(value = {
            @ApiResponse(code = 204, message = "Erfolgreich gelöscht"),
            @ApiResponse(code = 400, message = "Ungültige Anfrage"),
            @ApiResponse(code = 404, message = "Nicht gefunden")})
    public void deleteAssignment(@PathVariable("contactUuid") UUID contactUuid,
                              @PathVariable("assignmentUuid") UUID assignmentUuid) {
        assignmentModulContactService.deleteAssignment(contactUuid, assignmentUuid);
    }

}
