content: package med.voll.api.controller;
  
  
  
  import io.swagger.v3.oas.annotations.Operation;
  import io.swagger.v3.oas.annotations.security.SecurityRequirement;
  import jakarta.validation.Valid;
  import med.voll.api.domain.paciente.*;
  import org.springframework.beans.factory.annotation.Autowired;
  
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.Pageable;
  import org.springframework.data.web.PageableDefault;
  import org.springframework.http.ResponseEntity;
  import org.springframework.transaction.annotation.Transactional;
  import org.springframework.web.bind.annotation.*;
  import org.springframework.web.util.UriComponentsBuilder;
  
  @RestController
  @RequestMapping("/pacientes")
  @SecurityRequirement(name = "bearer-key")
  @SuppressWarnings("all")
  public class PacienteController {
  
      @Autowired
      private PacienteRepository repository;
  
      @PostMapping
      @Transactional
      @Operation(summary = "Registra un nuevo paciente")
      public ResponseEntity registrar(@RequestBody @Valid DatosRegistroPaciente datos, UriComponentsBuilder uriBuilder) {
          var paciente = new Paciente(datos);
          repository.save(paciente);
  
          var uri = uriBuilder.path("/pacientes/{id}").buildAndExpand(paciente.getId()).toUri();
          return ResponseEntity.created(uri).body(new DatosDetallesPaciente(paciente));
      }
  
      @GetMapping
      @Operation(summary = "Obtiene el listado para los pacientes")
      public ResponseEntity<Page<DatosListaPaciente>> listar(@PageableDefault(size = 10, sort = {"nombre"}) Pageable paginacion) {
          var page = repository.findAllByActivoTrue(paginacion).map(DatosListaPaciente::new);
          return ResponseEntity.ok(page);
      }
  
      @PutMapping
      @Transactional
      @Operation(summary = "Actualiza las informaciones para el paciente")
      public ResponseEntity actualizar(@RequestBody @Valid DatosActualizacionPaciente datos) {
          var paciente = repository.getReferenceById(datos.id());
          paciente.actualizarInformacoes(datos);
  
          return ResponseEntity.ok(new DatosDetallesPaciente(paciente));
      }
  
      @DeleteMapping("/{id}")
      @Transactional
      @Operation(summary = "Elimina un paciente a partir del ID")
      public ResponseEntity eliminar(@PathVariable Long id) {
          var paciente = repository.getReferenceById(id);
          paciente.eliminar();
  
          return ResponseEntity.noContent().build();
      }
  
      @GetMapping("/{id}")
      @Operation(summary = "obtiene los detalles para el paciente con el ID indicado")
      public ResponseEntity detallar(@PathVariable Long id) {
          var paciente = repository.getReferenceById(id);
          return ResponseEntity.ok(new DatosDetallesPaciente(paciente));
      }
  
  
  }
  
  