package sklep.klient;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;

// Ten i kolejne przykłady pokazują jak aplikacja kliencka napisana w Javie może wysyłać
// zapytania do usługi REST-owej (głównie GET, jest też gdzieś POST)
// korzystając z technologii JAX-RS "po stronie klienta".
// Aby z tego skorzystać, do projektu trzeba dodać bibliotekę z implementacją JAX-RS.
// Tutaj jest to resteasy-client.

public class Klient2_InputStream {

	public static void main(String[] args) {
		System.out.println("Startujemy...");
		Client client = ClientBuilder.newClient();
		
		System.out.println("Przygotowuję zapytanie...");
		WebTarget target = client.target(Ustawienia.URL_SERWERA + "products");
		Invocation.Builder requestBuilder = target.request();
		Invocation invocation = requestBuilder.buildGet();
		
		System.out.println("Wysyłam zapytanie...");
		Response response = invocation.invoke();
		
		// Wynikiem jest obiekt klasy Response - tej samej, co na serwerze (używaliśmy np. do generowania kodów 404).
		// W obiekcie można sprawdzić informacji o odpowiedzi: media type, status code.

		System.out.println("Otrzymałem response: " + response);
		System.out.println("Status: " + response.getStatus());
		System.out.println("Content-Type: " + response.getMediaType());
		
		if(response.getStatus() != 200) {
			System.out.println("Chyba coś nie tak, więc przerywam.");
			return;
		}
		
		// Aby odczytać zawartość zwróconą przez serwer, uzywamy metody readEntity.
		// (przy domyślnych ustawieniach) tę metodę można wywołać tylko raz.
		
		// W tej wersji dane odbieramy w postaci "surowej" jako ciąg bajtów za pomocą InputStream.
		// Jest to najbardziej wydajne, ale jednocześnie mało wygodne, podejście.
		
		String nazwaPliku = "wynik2." + Ustawienia.rozszerzenieDlaTypu(response.getMediaType());
		try(InputStream strumienDanych = response.readEntity(InputStream.class)) {
			long ileBajtow = Files.copy(strumienDanych, Paths.get(nazwaPliku), StandardCopyOption.REPLACE_EXISTING);
			System.out.printf("Zapisano %d bajtów do pliku %s\n", ileBajtow, nazwaPliku);
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("Gotowe");
	}

}
