package org.egl_cepgl.pm.controller.admin;

import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.slf4j.Slf4j;
import org.egl_cepgl.pm.dto.FileCategoryDto;
import org.egl_cepgl.pm.dto.ProjectDto;
import org.egl_cepgl.pm.dto.UserDto;
import org.egl_cepgl.pm.model.FileCategory;
import org.egl_cepgl.pm.model.Project;
import org.egl_cepgl.pm.model.user.User;
import org.egl_cepgl.pm.service.ProjectService;
import org.egl_cepgl.pm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@Api("api/admin/projects")
@RestController
@RequestMapping("api/admin/projects")
public class ProjectController
{
    private ProjectService projectService;

    @Autowired
    public ProjectController(ProjectService projectService) {
        this.projectService = projectService;
    }

    //@PreAuthorize("hasAuthority('ROLE_default-roles-egl_pm')")
    @PostMapping(value = "/add",consumes= MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    @ApiOperation(value="Add ..", notes="Cette méthode permet de..", response = Project.class)
    @ApiResponses(value= { @ApiResponse(code= 200, message = "créé/modifié"), @ApiResponse(code= 400, message = "Non valide") })
    public ResponseEntity<ProjectDto> addProject(@RequestBody ProjectDto projectDto)
    {
        //log.info("BVDDDDDDDDDDDDEEEE==="+userDto.toString());
        return ResponseEntity.ok(this.projectService.addProject(projectDto));
    }

    @GetMapping(value = "/all",produces = MediaType.APPLICATION_JSON_VALUE)
    @ApiOperation(value="List ..", notes="Cette méthode permet..", responseContainer = "List<ProjectDto>")
    @ApiResponses(value= { @ApiResponse(code= 200, message = "Une liste des ..") })
    public ResponseEntity<Map<String, Object>> findAll(
            @RequestParam(required = false) String search,
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "5") int size
    ){
        Page<Project> objs= projectService.findAll(search, page, size);
        Map<String, Object> response = new HashMap<>();
        response.put("projects", objs.getContent().stream().map(ProjectDto::fromEntity).collect(Collectors.toList()));
        response.put("currentPage", objs.getNumber());
        response.put("totalItems", objs.getTotalElements());
        response.put("totalPages", objs.getTotalPages());

        return new ResponseEntity<>(response, HttpStatus.OK);
    }

    @PutMapping(value = "/update",consumes= MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    @ApiOperation(value="Update ..", notes="Cette méthode permet de..", response = Project.class)
    @ApiResponses(value= { @ApiResponse(code= 200, message = "créé/modifié"), @ApiResponse(code= 400, message = "Non valide") })
    public ResponseEntity<Project> update(@RequestBody Project project)
    {    return ResponseEntity.ok(projectService.update(project));   }

    @DeleteMapping(value = "/delete/{id}")
    @ApiOperation(value = "Suppression d'un..", notes = "Cette méthode permet de supprimer..")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Supprimé")
    })
    ResponseEntity delete(@PathVariable("id") Long id) {
        projectService.delete(id);
        return ResponseEntity.ok().build();
    }
}
