package br.com.alura.forum.controller;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import javax.transaction.Transactional;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.UriComponentsBuilder;
import br.com.alura.forum.controller.dto.DetalhesDoTopicoDto;
import br.com.alura.forum.controller.dto.TopicoDto;
import br.com.alura.forum.controller.form.AtualizacaoTopicoForm;
import br.com.alura.forum.controller.form.TopicoForm;
import br.com.alura.forum.modelo.Curso;
import br.com.alura.forum.modelo.Topico;
import br.com.alura.forum.repository.CursoRepository;
import br.com.alura.forum.repository.TopicoRepository;
@RestController
@RequestMapping("/topicos")
public class TopicosController {
@Autowired
private TopicoRepository topicoRepository;
@Autowired
private CursoRepository cursoRepository;
@GetMapping
public Page<TopicoDto> lista(@RequestParam(required = false) String nomeCurso, @RequestParam int pagina, @RequestParam int qtd) { //requestparam avisa pro spring que esses parametros sao de url, obrigatorio // required=false diz que o nome do curso eh opcional
Pageable paginacao = PageRequest.of(pagina, qtd); // trabalhando com paginacao
if(nomeCurso == null) {
Page<Topico> topicos = topicoRepository.findAll(paginacao);
return TopicoDto.converter(topicos);
}
else {
Page<Topico> topicos = topicoRepository.findByCursoNome(nomeCurso, paginacao); // utilizando findBy... é só criar o método no repository que o springdata gera a query automaticamente de acordo com o que vem depois do By
return TopicoDto.converter(topicos);
}
}
@PostMapping
@Transactional
public ResponseEntity<TopicoDto> cadastrar(@RequestBody @Valid TopicoForm form, UriComponentsBuilder uriBuilder) { // quando é Get, o parametro vem na url, quando é Post, tem que avisar ao spring que o parametro vem no corpo
// o @valid vai validar o que vem do topicoform, que a gente anotou com os requisitos
Topico topico = form.converter(cursoRepository);
topicoRepository.save(topico);
URI uri = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.getId()).toUri();
return ResponseEntity.created(uri).body(new TopicoDto(topico));
}
@GetMapping("/{id}") // parametro dinamico
public ResponseEntity<DetalhesDoTopicoDto> detalhar(@PathVariable Long id) { // esse parametro nao vai vir na interrogacao, ele vai vir na /
Optional<Topico> topico = topicoRepository.findById(id);
if(topico.isPresent()) {
return ResponseEntity.ok(new DetalhesDoTopicoDto(topico.get()));
}
return ResponseEntity.notFound().build();
}
@PutMapping("/{id}")
@Transactional
public ResponseEntity<TopicoDto> atualizar(@PathVariable Long id, @RequestBody @Valid AtualizacaoTopicoForm form){
Optional<Topico> optional = topicoRepository.findById(id);
if(optional.isPresent()) {
Topico topico = form.atualizar(id, topicoRepository);
return ResponseEntity.ok(new TopicoDto(topico));
}
return ResponseEntity.notFound().build();
}
@DeleteMapping("/{id}")
@Transactional
public ResponseEntity<TopicoDto> remover(@PathVariable Long id) {
Optional<Topico> optional = topicoRepository.findById(id);
if(optional.isPresent()) {
topicoRepository.deleteById(id);
return ResponseEntity.ok().build();
}
return ResponseEntity.notFound().build();
}
}