package org.egl_cepgl.pm.controller;

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.ProCategoryDto;
import org.egl_cepgl.pm.dto.ProjectDto;
import org.egl_cepgl.pm.model.ProcurementCategory;
import org.egl_cepgl.pm.model.Project;
import org.egl_cepgl.pm.model.ValidateCode;
import org.egl_cepgl.pm.service.ProcurementCategoryService;
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.Optional;
import java.util.stream.Collectors;

@Slf4j
@Api("api/admin/categories")
@RestController
@RequestMapping("api/admin/categories")
public class ProcurementCategoryController
{
    private ProcurementCategoryService service;

    @Autowired
    public ProcurementCategoryController(ProcurementCategoryService service) {
        this.service = service;
    }

    //@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 = ProcurementCategory.class)
    @ApiResponses(value= { @ApiResponse(code= 200, message = "créé/modifié"), @ApiResponse(code= 400, message = "Non valide") })
    public ResponseEntity<ProCategoryDto> add(@RequestBody ProcurementCategory dto)
    {
        //log.info("BVDDDDDDDDDDDDEEEE==="+userDto.toString());
        return ResponseEntity.ok(ProCategoryDto.fromEntity(this.service.add(dto)));
    }

    @GetMapping(value = "/all",produces = MediaType.APPLICATION_JSON_VALUE)
    @ApiOperation(value="List ..", notes="Cette méthode permet..", responseContainer = "List<ProcurementCategory>")
    @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<ProcurementCategory> objs= service.findAll(search, page, size);
        Map<String, Object> response = new HashMap<>();
        response.put("proCategories", objs.getContent().stream().map(ProCategoryDto::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 = ProcurementCategory.class)
    @ApiResponses(value= { @ApiResponse(code= 200, message = "créé/modifié"), @ApiResponse(code= 400, message = "Non valide") })
    public ResponseEntity<ProCategoryDto> update(@RequestBody ProCategoryDto dto)
    {    return ResponseEntity.ok(this.service.update(dto));   }

    @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) {
        service.delete(id);
        return ResponseEntity.ok().build();
    }

    @PostMapping(value="/validateCode", consumes= MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Boolean> validateCode(@RequestBody ValidateCode obj)
    {
        return ResponseEntity.ok(service.existsByCode(obj.getCode()));
    }
}
