package de.dis2013.editor;

import java.util.Set;

import de.dis2013.core.ImmoService;
import de.dis2013.data.Haus;
import de.dis2013.data.Makler;
import de.dis2013.data.Wohnung;
import de.dis2013.menu.AppartmentSelectionMenu;
import de.dis2013.menu.HouseSelectionMenu;
import de.dis2013.menu.Menu;
import de.dis2013.util.FormUtil;

/**
 * Klasse für die Menüs zur Verwaltung von Immobilien
 */
public class ImmobilienEditor {
	///Immobilienservice, der genutzt werden soll
	private ImmoService service;
	
	///Wird als Verwalter für die Immobilien eingetragen
	private Makler verwalter;
	
	public ImmobilienEditor(ImmoService service, Makler verwalter) {
		this.service = service;
		this.verwalter = verwalter;
	}
	
	/**
	 * Zeigt das Immobilien-Hauptmenü
	 */
	public void showImmoMenu() {
		//Menüoptionen
		final int NEW_HOUSE = 0;
		final int EDIT_HOUSE = 1;
		final int DELETE_HOUSE = 2;
		final int NEW_APPARTMENT = 3;
		final int EDIT_APPARTMENT = 4;
		final int DELETE_APPARTMENT = 5;
		final int BACK = 6;
		
		//Immobilienverwaltungsmenü
		Menu maklerMenu = new Menu("Immobilien-Verwaltung");
		maklerMenu.addEntry("Neues Haus anlegen", NEW_HOUSE);
		maklerMenu.addEntry("Haus bearbeiten", EDIT_HOUSE);
		maklerMenu.addEntry("Haus löschen", DELETE_HOUSE);
		
		maklerMenu.addEntry("Neue Wohnung anlegen", NEW_APPARTMENT);
		maklerMenu.addEntry("Wohnung bearbeiten", EDIT_APPARTMENT);
		maklerMenu.addEntry("Wohnung löschen", DELETE_APPARTMENT);
		
		maklerMenu.addEntry("Zurück zum Hauptmenü", BACK);
		
		//Verarbeite Eingabe
		while(true) {
			int response = maklerMenu.show();
			
			switch(response) {
				case NEW_HOUSE:
					newHouse();
					break;
				case EDIT_HOUSE:
					editHouse();
					break;
				case DELETE_HOUSE:
					deleteHouse();
					break;
				case NEW_APPARTMENT:
					newAppartment();
					break;
				case EDIT_APPARTMENT:
					editAppartment();
					break;
				case DELETE_APPARTMENT:
					deleteAppartment();
					break;
				case BACK:
					return;
			}
		}
	}
	
	/**
	 * Abfrage der Daten für ein neues Haus
	 */
	public void newHouse() {
		Haus h = new Haus();
		
		h.setOrt(FormUtil.readString("Ort"));
		h.setPlz(FormUtil.readInt("PLZ"));
		h.setStrasse(FormUtil.readString("Straße"));
		h.setHausnummer(FormUtil.readString("Hausnummer"));
		h.setFlaeche(FormUtil.readInt("Fläche"));
		h.setStockwerke(FormUtil.readInt("Stockwerke"));
		h.setKaufpreis(FormUtil.readInt("Kaufpreis"));
		h.setGarten(FormUtil.readBoolean("Garten"));
		h.setVerwalter(this.verwalter);
		
		service.addHaus(h);
	}
	
	/**
	 * Lässt den Benutzer ein Haus zum bearbeiten auswählen
	 * und fragt anschließend die neuen Daten ab.
	 */
	public void editHouse() {
		//Alle Häuser suchen, die vom Makler verwaltet werden
		Set<Haus> haeuser = service.getAllHaeuserForMakler(verwalter);
		
		//Auswahlmenü für das zu bearbeitende Haus
		HouseSelectionMenu hsm = new HouseSelectionMenu("Liste der verwalteten Häuser", haeuser);
		int id = hsm.show();
		
		//Falls nicht der Eintrag "zurück" gewählt wurde, Haus bearbeiten
		if(id != HouseSelectionMenu.BACK) {
			//Gewähltes Haus laden
			Haus h = service.getHausById(id);
			
			System.out.println("Haus "+h.getStrasse()+" "+h.getHausnummer()+", "+h.getPlz()+" "+h.getOrt()+" wird bearbeitet. Leere Felder bzw. Eingabe von 0 lässt Feld unverändert.");
			
			//Neue Daten abfragen
			String newOrt = FormUtil.readString("Ort", h.getOrt());
			int newPlz = FormUtil.readInt("PLZ", h.getPlz());
			String newStrasse = FormUtil.readString("Straße", h.getStrasse());
			String newHausNummer = FormUtil.readString("Hausnummer", h.getHausnummer());
			int newFlaeche = FormUtil.readInt("Fläche", h.getFlaeche());
			int newStockwerke = FormUtil.readInt("Stockwerke", h.getStockwerke());
			int newKaufpreis = FormUtil.readInt("Kaufpreis", h.getKaufpreis());
			boolean newGarten = FormUtil.readBoolean("Garten", h.isGarten());
			
			//Neue Daten setzen
			h.setOrt(newOrt);
			h.setStrasse(newStrasse);
			h.setHausnummer(newHausNummer);
			h.setPlz(newPlz);
			h.setFlaeche(newFlaeche);
			h.setStockwerke(newStockwerke);
			h.setKaufpreis(newKaufpreis);
			h.setGarten(newGarten);
			
			service.editHaus(h);
		}
	}
	
	/**
	 * Zeigt die Liste von verwalteten Häusern und löscht das
	 * entsprechende Haus nach Auswahl
	 */
	public void deleteHouse() {
		//Alle Häuser suchen, die vom Makler verwaltet werden
		Set<Haus> haeuser = service.getAllHaeuserForMakler(verwalter);
		
		//Auswahlmenü für das zu bearbeitende Haus
		HouseSelectionMenu hsm = new HouseSelectionMenu("Liste der verwalteten Häuser", haeuser);
		int id = hsm.show();
		
		//Falls nicht der Eintrag "zurück" gewählt wurde, Haus löschen
		if(id != HouseSelectionMenu.BACK) {
			Haus h = service.getHausById(id);
			service.deleteHaus(h);
		}
	}
	
	/**
	 * Abfrage der Daten für eine neue Wohnung
	 */
	public void newAppartment() {
		Wohnung w = new Wohnung();
		
		w.setOrt(FormUtil.readString("Ort"));
		w.setPlz(FormUtil.readInt("PLZ"));
		w.setStrasse(FormUtil.readString("Straße"));
		w.setHausnummer(FormUtil.readString("Hausnummer"));
		w.setFlaeche(FormUtil.readInt("Fläche"));
		w.setStockwerk(FormUtil.readInt("Stockwerk"));
		w.setMietpreis(FormUtil.readInt("Mietpreis"));
		w.setEbk(FormUtil.readBoolean("EBK"));
		w.setBalkon(FormUtil.readBoolean("Balkon"));
		w.setVerwalter(this.verwalter);
		
		service.addWohnung(w);
	}
	
	/**
	 * Lässt den Benutzer eine Wohnung zum bearbeiten auswählen
	 * und fragt anschließend die neuen Daten ab.
	 */
	public void editAppartment() {
		//Alle Wohnungen suchen, die vom Makler verwaltet werden
		Set<Wohnung> wohnungen = service.getAllWohnungenForMakler(verwalter);
		
		//Auswahlmenü für die zu bearbeitende Wohnung
		AppartmentSelectionMenu asm = new AppartmentSelectionMenu("Liste der verwalteten Wohnungen", wohnungen);
		int id = asm.show();
		
		//Falls nicht der Eintrag "zurück" gewählt wurde, Wohnung bearbeiten
		if(id != AppartmentSelectionMenu.BACK) {
			//Wohnung laden
			Wohnung w = service.getWohnungById(id);
			
			System.out.println("Haus "+w.getStrasse()+" "+w.getHausnummer()+", "+w.getPlz()+" "+w.getOrt()+" wird bearbeitet. Leere Felder bzw. Eingabe von 0 lässt Feld unverändert.");
			
			//Neue Daten abfragen
			String newOrt = FormUtil.readString("Ort", w.getOrt());
			int newPlz = FormUtil.readInt("PLZ", w.getPlz());
			String newStrasse = FormUtil.readString("Straße", w.getStrasse());
			String newHausNummer = FormUtil.readString("Hausnummer", w.getHausnummer());
			int newFlaeche = FormUtil.readInt("Fläche", w.getFlaeche());
			int newStockwerk = FormUtil.readInt("Stockwerk", w.getStockwerk());
			int newMietpreis = FormUtil.readInt("Mietpreis", w.getMietpreis());
			boolean newEbk = FormUtil.readBoolean("EBK", w.isEbk());
			boolean newBalkon = FormUtil.readBoolean("Balkon", w.isBalkon());
			
			//Neue Daten setzen
			w.setOrt(newOrt);
			w.setStrasse(newStrasse);
			w.setHausnummer(newHausNummer);
			w.setPlz(newPlz);
			w.setFlaeche(newFlaeche);
			w.setStockwerk(newStockwerk);
			w.setMietpreis(newMietpreis);
			w.setEbk(newEbk);
			w.setBalkon(newBalkon);
			service.editWohnung(w);
		}
	}
	
	/**
	 * Zeigt die Liste von verwalteten Wohnungen und löscht die
	 * entsprechende Wohnung nach Auswahl
	 */
	public void deleteAppartment() {
		//Alle Wohnungen suchen, die vom Makler verwaltet werden
		Set<Wohnung> wohnungen = service.getAllWohnungenForMakler(verwalter);
		
		//Auswahlmenü für die zu bearbeitende Wohnung
		AppartmentSelectionMenu asm = new AppartmentSelectionMenu("Liste der verwalteten Wohnungen", wohnungen);
		int id = asm.show();
		
		//Falls nicht der Eintrag "zurück" gewählt wurde, Wohnung löschen
		if(id != HouseSelectionMenu.BACK) {
			Wohnung w = service.getWohnungById(id);
			service.deleteWohnung(w);
		}
	}
}
