package sklep.rest;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;

import sklep.model.Product;
import sklep.repository.ProductRepository;
import sklep.util.PhotoUtil;

@RestController
@RequestMapping("/rest/products")
public class ProductEndpoint {
    @Autowired
    private ProductRepository productRepository;
    
    @Autowired
    private PhotoUtil photoUtil;
    
    @GetMapping
    public List<Product> readAll() {
        return productRepository.findAll();
    }
    
    @GetMapping("/{id}")
    public Product readOne(@PathVariable Integer id) {
        return productRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
    }
    
    // Ta metoda pokazana tylko po to, aby wytłumaczyć, że struktura adresów powinna odpowiadać logicznej strukturze danych.
    // W prawdziwej aplikacji raczej nie dochodzi się do poziomu pojedynczych pól. Teoretycznie można.
    @GetMapping("/{id}/price")
    public BigDecimal getPrice(@PathVariable Integer id) {
        return readOne(id).getPrice();
    }
    
    
    @GetMapping(path="/{id}/photo", produces="image/jpeg")
    public byte[] getPhoto(@PathVariable Integer id) {
        return photoUtil.readBytes(id);
    }

}
