package es.danirod.quarkus.bookshelf;

import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.Response;

import java.util.List;
import java.util.NoSuchElementException;

@Path("/books")
public class BookResource {

    private BookRepository booksRepository;

    @Inject
    public BookResource(BookRepository booksRepository) {
        this.booksRepository = booksRepository;
    }

    @GET
    public List<Book> listBooks() {
        return booksRepository.listAll();
    }

    @POST
    @Transactional
    public Book insertBook(Book givenBook) {
        booksRepository.persist(givenBook);
        return givenBook;
    }

    @GET
    @Path("{id}")
    public Response retrieveBook(@PathParam("id") Long id) {
        Book book = booksRepository.findById(id);
        if (book != null) {
            return Response.ok(book).build();
        }
        return Response.status(404).entity("Not found").build();
    }

    @DELETE
    @Path("{id}")
    @Transactional
    public void deleteBook(@PathParam("id") Long id) {
        booksRepository.deleteById(id);
    }

    @PUT
    @Path("{id}")
    @Transactional
    public Book updateBook(@PathParam("id") Long id, Book bookData) {
        Book existingBook = booksRepository.findById(id);
        if (existingBook == null) {
            throw new NoSuchElementException("Este libro no existe");
        }
        existingBook.setTitle(bookData.getTitle());
        existingBook.setDescription(bookData.getDescription());
        existingBook.setPubDate(bookData.getPubDate());
        existingBook.setNumPages(bookData.getNumPages());

        // El libro que persistimos es el que nos entregó el ORM.
        booksRepository.persist(existingBook);
        return existingBook;
    }
}