package ogloszenia.rest;

import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.annotation.security.RolesAllowed;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import ogloszenia.Ustawienia;
import ogloszenia.baza.sqlite.DostepDoBazySqlite;
import ogloszenia.baza.sqlite.OgloszenieDAO;
import ogloszenia.exn.BladAplikacji;
import ogloszenia.exn.BladBazyDanych;
import ogloszenia.exn.NieznanyRekord;
import ogloszenia.model.ListaOgloszen;
import ogloszenia.model.OgloszenieSamochodowe;

@Path("/ogloszenia")
public class ROgloszenia {
	
	@GET
	@Produces({"application/xml",
		"application/json;charset=utf-8",
		"text/plain;charset=utf-8",
		"application/pdf",
		"text/html"})
	public ListaOgloszen wszystkie() throws BladBazyDanych {
		try(DostepDoBazySqlite db = DostepDoBazySqlite.newSQLite()) {
			OgloszenieDAO dao = db.newOgloszenieDAO();
			ListaOgloszen lista = new ListaOgloszen();
			lista.ogloszenia = dao.readAllFull();
			return lista;
		}
	}
	
	@GET
	@Produces({"application/xml",
		"application/json;charset=utf-8",
		"text/plain;charset=utf-8",
		"application/pdf",
		"text/html"})
	@Path("/{id}")
	public OgloszenieSamochodowe jedno(
			@PathParam("id") int idOgloszenia) throws BladBazyDanych, NieznanyRekord {
		try(DostepDoBazySqlite db = DostepDoBazySqlite.newSQLite()) {
			OgloszenieDAO dao = db.newOgloszenieDAO();
			return dao.byIdFull(idOgloszenia);
		}
	}
	
	@POST
	@Consumes({"application/xml", "application/json"})
	@Produces({"application/xml", "application/json"})
	public OgloszenieSamochodowe zapisz(
			OgloszenieSamochodowe ogloszenie) throws BladBazyDanych {
		
		try(DostepDoBazySqlite db = DostepDoBazySqlite.newSQLite()) {
			OgloszenieDAO dao = db.newOgloszenieDAO();
			dao.save(ogloszenie);
			return ogloszenie;
		}
	}
	
	@GET
	@Produces("text/plain")
	@Path("/{id}/cena")
	@RolesAllowed({"uprawniony"})
	public BigDecimal cena(
			@PathParam("id") int idOgloszenia) throws BladBazyDanych, NieznanyRekord {
		try(DostepDoBazySqlite db = DostepDoBazySqlite.newSQLite()) {
			OgloszenieDAO dao = db.newOgloszenieDAO();
			OgloszenieSamochodowe ogl = dao.byIdFull(idOgloszenia);
			return ogl.getCena();
		}
	}

	@PUT
	@Consumes("text/plain")
	@Path("/{id}/cena")
	@RolesAllowed({"uprawniony"})
	public void setCena(
			@PathParam("id") int idOgloszenia,
			BigDecimal nowaCena) throws BladBazyDanych, NieznanyRekord {
		try(DostepDoBazySqlite db = DostepDoBazySqlite.newSQLite()) {
			OgloszenieDAO dao = db.newOgloszenieDAO();
			dao.zmienCene(idOgloszenia, nowaCena);
		}
	}

	@GET
	@Produces("text/plain;charset=utf-8")
	@Path("/{id}/opis")
	public String opis(
			@PathParam("id") int idOgloszenia) throws BladBazyDanych, NieznanyRekord {
		try(DostepDoBazySqlite db = DostepDoBazySqlite.newSQLite()) {
			OgloszenieDAO dao = db.newOgloszenieDAO();
			OgloszenieSamochodowe ogl = dao.byIdFull(idOgloszenia);
			return ogl.getOpis();
		}
	}
	
	@GET
	@Produces("image/jpeg")
	@Path("/{id}/foto")
	public InputStream foto(
			@PathParam("id") int idOgloszenia) throws BladAplikacji {
		try {
			String plik = idOgloszenia + ".jpg";
			java.nio.file.Path path = Paths.get(Ustawienia.PHOTOS_PATH, plik);
			return Files.newInputStream(path);
		} catch (IOException e) {
			throw new BladAplikacji("Brak pliku ze zdjęciem nr " + idOgloszenia, e);
		}
	}
}
