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.security.core.Authentication;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import sn.ladoum.bergerie.dto.ProfilUpdateDto;
import sn.ladoum.bergerie.dto.UtilisateurDto;
import sn.ladoum.bergerie.service.UtilisateurService;

import java.util.List;

@RestController
@RequestMapping("/utilisateurs")
@RequiredArgsConstructor
public class UtilisateurController {

    private final UtilisateurService utilisateurService;

    @GetMapping("/me")
    public UtilisateurDto me(Authentication auth) {
        return utilisateurService.findByEmail(auth.getName());
    }

    @PostMapping(value = "/me/logo", consumes = "multipart/form-data")
    public UtilisateurDto uploadMyLogo(Authentication auth, @RequestParam("file") MultipartFile file) {
        return utilisateurService.uploadLogoByEmail(auth.getName(), file);
    }

    @PutMapping("/me")
    public UtilisateurDto updateMe(Authentication auth, @Valid @RequestBody ProfilUpdateDto dto) {
        return utilisateurService.updateMe(auth.getName(), dto);
    }

    /** Liste allégée des éleveurs — accessible à tout utilisateur authentifié. */
    @GetMapping("/eleveurs")
    public List<UtilisateurDto> eleveurs() {
        return utilisateurService.findEleveurs();
    }

    @GetMapping
    @PreAuthorize("hasRole('ADMIN')")
    public List<UtilisateurDto> getAll() {
        return utilisateurService.findAll();
    }

    @GetMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public UtilisateurDto getById(@PathVariable Long id) {
        return utilisateurService.findById(id);
    }

    @PostMapping
    @PreAuthorize("hasRole('ADMIN')")
    @ResponseStatus(HttpStatus.CREATED)
    public UtilisateurDto create(@Valid @RequestBody UtilisateurDto dto) {
        return utilisateurService.create(dto);
    }

    @PutMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public UtilisateurDto update(@PathVariable Long id, @Valid @RequestBody UtilisateurDto dto) {
        return utilisateurService.update(id, dto);
    }

    @PostMapping(value = "/{id}/logo", consumes = "multipart/form-data")
    @PreAuthorize("hasRole('ADMIN')")
    public UtilisateurDto uploadLogo(@PathVariable Long id, @RequestParam("file") MultipartFile file) {
        return utilisateurService.uploadLogo(id, file);
    }

    @PostMapping("/{id}/bloquer")
    @PreAuthorize("hasRole('ADMIN')")
    public UtilisateurDto bloquer(@PathVariable Long id, Authentication auth) {
        UtilisateurDto me = utilisateurService.findByEmail(auth.getName());
        if (me.getId() != null && me.getId().equals(id)) {
            throw new IllegalArgumentException("Vous ne pouvez pas bloquer votre propre compte.");
        }
        return utilisateurService.bloquer(id);
    }

    @PostMapping("/{id}/debloquer")
    @PreAuthorize("hasRole('ADMIN')")
    public UtilisateurDto debloquer(@PathVariable Long id) {
        return utilisateurService.debloquer(id);
    }

    @DeleteMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public ResponseEntity<Void> delete(@PathVariable Long id, Authentication auth) {
        UtilisateurDto me = utilisateurService.findByEmail(auth.getName());
        if (me.getId() != null && me.getId().equals(id)) {
            throw new IllegalArgumentException("Vous ne pouvez pas supprimer votre propre compte.");
        }
        utilisateurService.delete(id);
        return ResponseEntity.noContent().build();
    }
}
