package restClientHTTPErrors;

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.client.Invocation.Builder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status.Family;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import restClientHTTPErrors.Leistung;

public class RestClient {

	public static void main(String[] args) 
	{
		// URL des Servers
		String baseUrl   = "http://localhost:4434";
		// Name des Studenten, fuer den wir anfragen
		String name 		 = "Hannah Jung"; 

		// Relative Pfade auf dem Server
		String webContextPath = "/student";  
		String webContextUnderPath = "/leistung";
		
		Student student = new Student();

		System.out.println( "\nAngefragte URL: " + baseUrl + webContextPath );

		// GSON Instanz fuer das Interpretieren der Antwort vom Server
		Gson gson = new GsonBuilder().create();
		
		// Jersey Client fuer das Abfragen des Servers erzeugen
		Client client = ClientBuilder.newClient();
		
		// Server abfragen: 1) Matrikelnummer zu Name
		// WebTarget erzeugen und richtigen Pfad angeben
		WebTarget target = client.target( baseUrl + webContextPath );
		// Parameter name anhaengen
		target = target.queryParam("name",name);
		// GET-Anfrage erzeugen
		Builder builder = target.request( MediaType.APPLICATION_JSON );
		Invocation invocation = builder.buildGet();
		// Anfrage an Server senden und JSON-String empfangen
		Response response = invocation.invoke(Response.class );
		// JSON-String decodieren
		String jsonString = response.readEntity(String.class);
		student = gson.fromJson(jsonString, Student.class);
		
		//Status pruefen der GET Anfrage
		if(response.getStatusInfo().getFamily() == Family.SUCCESSFUL)
		{
			System.out.println("\nStudent gefunden: " + student.matrikelNummer );
			
			// Server abfragen: 2) leistungen zur Matrikelnummer
			// WebTarget erzeugen und richtigen Pfad angeben
			target = client.target( baseUrl + webContextPath);
			// gefundene Matrikelnummer an Pfad anhaengen
			target = target.path( String.valueOf(student.matrikelNummer) );
			// Unterpfad /leistung an Pfad anhaengen
			target = target.path( webContextUnderPath );
			// GET-Anfrage erzeugen
			builder = target.request( MediaType.APPLICATION_JSON );
			invocation = builder.buildGet();
			// Anfrag an Server senden und JSON-String empfangen
			response = invocation.invoke(Response.class );
			// JSON-String decodieren
			jsonString = response.readEntity(String.class);
			Leistung[] leistungen = gson.fromJson(jsonString, Leistung[].class);
			
			System.out.println("\nLeistungen:" );
			for(Leistung l : leistungen)
			{
				System.out.println(l.modul + ": " + l.note);	
			}
		}
		else
		{
			System.out.println("\nKeinen Studenten gefunden!" );
		}
	}
}
