package ogloszenia.soap;

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

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.soap.MTOM;

import ogloszenia.baza.DostepDoBazy;
import ogloszenia.baza.OgloszeniaDAO;
import ogloszenia.exn.BladBazyDanych;
import ogloszenia.exn.NieznanyRekord;
import ogloszenia.model.Samochodowe;
import ogloszenia.util.FotoUtil;

//@WebService i wsparcie dla web-serwisów (JAX-WS) było obecne w Javie _Standard_ Edition w wersjach od 6 do 10
@WebService
@MTOM
public class SerwisOgloszeniowy {
	@WebResult(name="ogloszenie")
	public List<Samochodowe> odczytajWszystkie() throws BladBazyDanych {
		try(DostepDoBazy db = new DostepDoBazy()) {
			OgloszeniaDAO dao = db.ogloszeniaDAO();
			return dao.odczytajWszystkie();
		}
	}

	@WebResult(name="ogloszenie")
	public List<Samochodowe> odczytajWgCeny(
			@WebParam(name="min") BigDecimal cenaOd,
			@WebParam(name="max") BigDecimal cenaDo) throws BladBazyDanych {
		try(DostepDoBazy db = new DostepDoBazy()) {
			OgloszeniaDAO dao = db.ogloszeniaDAO();
			return dao.odczytajWedlugCeny(cenaOd, cenaDo);
		}
	}
	
	@WebResult(name="ogloszenie")
	public Samochodowe odczytajWgId(@WebParam(name="id") int idOgloszenia) throws BladBazyDanych, NieznanyRekord {
		try(DostepDoBazy db = new DostepDoBazy()) {
			OgloszeniaDAO dao = db.ogloszeniaDAO();
			return dao.odczytajWgId(idOgloszenia);
		}
	}
	
	public void zapisz(@WebParam(name="ogloszenie") Samochodowe ogloszenie) throws BladBazyDanych {
		try(DostepDoBazy db = new DostepDoBazy()) {
			OgloszeniaDAO dao = db.ogloszeniaDAO();
			dao.zapisz(ogloszenie);
		}
	}
	
	@WebResult(name="bytes")
	public byte[] foto(@WebParam(name="id") int idOgloszenia) throws NieznanyRekord {
		return FotoUtil.wczytajFoto(idOgloszenia);
	}

	
	// przykłady spoza tematu ogłoszeń
	public String sayHello(String name) {
		return "Hello " + name;
	}
	
	@WebResult(name="czas")
	public String ktoraGodzina() {
		System.out.println("ping");
		return LocalTime.now().toString();
	}
	
	@WebResult(name="wynik")
	public double oblicz(
			@WebParam(name="operacja") String op,
			@WebParam(name="arg1") double arg1,
			@WebParam(name="arg2") double arg2) {
		switch(op) {
		case "+": return arg1 + arg2;
		case "-": return arg1 - arg2;
		case "*": return arg1 * arg2;
		case "/": return arg1 / arg2;
		default : return 0;
		}
	}
}
