package sn.ladoum.bergerie.controller;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import sn.ladoum.bergerie.dto.EtatReproducteurDto;
import sn.ladoum.bergerie.dto.SaillieDto;
import sn.ladoum.bergerie.service.SaillieService;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/saillies")
@RequiredArgsConstructor
public class SaillieController {

    private final SaillieService saillieService;

    @GetMapping
    public List<SaillieDto> getAll() {
        return saillieService.findAll();
    }

    @GetMapping("/{id}")
    public SaillieDto getById(@PathVariable Long id) {
        return saillieService.findById(id);
    }

    @PostMapping
    @PreAuthorize("hasAnyRole('ADMIN','ELEVEUR')")
    @ResponseStatus(HttpStatus.CREATED)
    public SaillieDto create(@Valid @RequestBody SaillieDto dto) {
        return saillieService.create(dto);
    }

    @PostMapping("/{id}/echec")
    @PreAuthorize("hasAnyRole('ADMIN','ELEVEUR')")
    public SaillieDto marquerEchec(@PathVariable Long id, @RequestBody(required = false) String raison) {
        return saillieService.marquerEchec(id, raison);
    }

    @PostMapping("/{id}/confirmer")
    @PreAuthorize("hasAnyRole('ADMIN','ELEVEUR')")
    public SaillieDto confirmer(@PathVariable Long id,
                                @RequestBody(required = false) Map<String, String> body) {
        LocalDate date = null;
        if (body != null && body.get("dateConfirmation") != null) {
            date = LocalDate.parse(body.get("dateConfirmation"));
        }
        return saillieService.confirmer(id, date);
    }

    @PutMapping("/{id}")
    @PreAuthorize("hasAnyRole('ADMIN','ELEVEUR')")
    public SaillieDto update(@PathVariable Long id, @Valid @RequestBody SaillieDto dto) {
        return saillieService.update(id, dto);
    }

    @DeleteMapping("/{id}")
    @PreAuthorize("hasAnyRole('ADMIN','ELEVEUR')")
    public ResponseEntity<Void> delete(@PathVariable Long id) {
        saillieService.delete(id);
        return ResponseEntity.noContent().build();
    }

    @GetMapping("/etat-reproducteur/{moutonId}")
    public EtatReproducteurDto etatReproducteur(@PathVariable Long moutonId) {
        return saillieService.etatReproducteur(moutonId);
    }
}
