package VorlesungsFolien.Verebung;

import java.util.ArrayList;

public class Firma {
	private ArrayList<Mitarbeiter> mas = new ArrayList<>();
	
	public static void main(String[] args) {
		Mitarbeiter mi = new Manager("Stromberg", "01.02.1970", "Finanzen");
		Manager ma = new Geschaeftsfuehrer();
		Mitarbeiter m = new Geschaeftsfuehrer();
		
		
		
		
		// Ja weil Manager ein Mitarbeiter ist
		if (mi instanceof Mitarbeiter )
			System.out.println("Ja ");
		
		// Ja weil Manager ein Manager ist
		if (mi instanceof Manager )
			System.out.println("Ja stimmt");
		
		// nein, weil nicht jeder manager ein Geschaeftsfuehrer ist, aber jeder Geschaeftsfuehrer ist ein manager
		if (mi instanceof Geschaeftsfuehrer) 
			System.out.println("Ja");
		
		if (null instanceof Geschaeftsfuehrer )
			System.out.println("null");
		
		if (null instanceof Mitarbeiter )
			System.out.println("null");
		
		if (null instanceof Manager )
			System.out.println("null");
		
		if (ma instanceof Geschaeftsfuehrer)
			System.out.println("Ja");
		
		mi = ma;
		
		//ma = mi; nein, weil nicht jeder mitarbeiter ein manager ist!
		
		
		
		
		Firma firma = new Firma();
		Mitarbeiter mitarbeiter2 = new Mitarbeiter("Mayer", "12.12.1999");
		Mitarbeiter mitarbeiter = new Mitarbeiter("Müller", "27.10.1972");
		Manager manager = new Manager("Stromberg", "01.02.1970", "Finanzen");
		firma.mitarbeiterEinstellen(mitarbeiter);
		firma.mitarbeiterEinstellen(manager);
		
		
		firma.mitarbeiterEinstellen(mitarbeiter2);
		
		/* geht nicht! Warum?
		 *  weil nicht jeder mitarbeiter ein manager ist!
		 */
		// manager = mitarbeiter;	//geht nicht!	
		
		
		
		//weil jeder manager ist ein mitarbeiter
//		mitarbeiter = manager;// Ja geht:
		System.out.println("Polymorphismus");
		System.out.println(mitarbeiter.getGehalt());
		System.out.println(manager.getAbteilung());
		// System.out.println(mitarbeiter.getAbteilung());	// geht nicht, wg. statischem Typ Mitarbeiter
		
	
			System.out.println("Geht ");
			
			Manager me = ((Manager)mitarbeiter);
			
//			mitarbeiter2 = manager;// Ja geht:
			Manager md =((Manager)mitarbeiter2);
		
		// ClassCastException zur laufzeit, weil ich if (mitarbeiter instanceof Manager) verwenden soll
		
		
		// WICHTIG:
		//instanceof prüft, ob die klasse manager die klasse mitarbeiter erbt
	}
	
	private void mitarbeiterEinstellen(Mitarbeiter m) {
		mas.add(m);
	}
	
	private void gehaltsErhöhung() {
		for (Mitarbeiter m : mas) {
			double erhöhung = 0.02;
			
			// System.out.println(m instanceof String);		// das geht NICHT, muss zur Vererbungshierachie passen
			
			if (m instanceof Manager)
				erhöhung = 0.12;
//			else if (m instanceof Geschäftsführer)
//				erhöhung = 0.2;
				
			m.setGehalt(m.getGehalt() * (1 + erhöhung));
		}
	}
}

class Mitarbeiter extends Object {
	private String name;
	private double gehalt;
	private String geburtsdatum;

	public Mitarbeiter(String name, String geburtsdatum) {
		this(name, 35000, geburtsdatum);
	}

	public Mitarbeiter(String name, double gehalt, String geburtsdatum) {
		this.name = name;
		this.gehalt = gehalt;
		this.geburtsdatum = geburtsdatum;
	}
	
	public Mitarbeiter() {
		
	}

	public String getDetails() {
		return name;
	}

	public double getGehalt() {
		return gehalt;
	}

	public void setGehalt(double gehalt) {
		this.gehalt = gehalt;
	}
}

class Manager extends Mitarbeiter {
	private String abteilung;

	public Manager(String name, String geburtsdatum, String abteilung) {
		super(name, 65000, geburtsdatum);	// das MUSS zuerst gemacht werden!
		this.abteilung = abteilung;
	}
	
	public Manager() {
		
	}
	
	public String getDetails() {
		return super.getDetails() + " " + abteilung;
	}

	public String getAbteilung() {
		return abteilung;
	}
}

class Geschaeftsfuehrer extends Manager{

	public Geschaeftsfuehrer(String name, String geburtsdatum, String abteilung) {
		super(name, geburtsdatum, abteilung);
	}
	
	public Geschaeftsfuehrer(){
		
	}
	
	public void printGeschaeftsfuehrer() {
		System.out.println("Hi");
	}
	
}
