package Übungen.TaschenrechnerGUI;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

public class Controller implements ActionListener {

	Modell<Number, Number> m1;
	View v1;

	String letzterText = "";
	char operationen[] = { '+', '-', 'x', '÷' };
	char merker = ' ';
	String erst = "";
	String last = "";
	Number zahl1;
	Number zahl2;

	public Controller(Modell<Number, Number> m1, View v1) {
		this.m1 = m1;
		this.v1 = v1;
		getButtons();
	}

	public void getButtons() {
		ActionListener actionListener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				letzterText = v1.eingabe.getText();
				String speicher = "";
				// Gibt mir, welche Button gedrückt ist
				JButton src = (JButton) e.getSource();

				speicher = src.getText();
				v1.setEingabe(letzterText + speicher);
				letzterText = v1.eingabe.getText();	

				if (e.getSource() == v1.berechnen) {
				    checkeOperator();
				    textverteilen();
				    textToNumber();
				    String res = "";
				    Number ergebnis = 0;
				    System.out.println(ergebnis.toString());
				    switch (merker) {
					case '+':
						ergebnis = m1.add(zahl1, zahl2).doubleValue();
						break;

					case '-':
						ergebnis = m1.sub(zahl1, zahl2).doubleValue();
						break;

					case 'x':
						ergebnis = m1.multi(zahl1, zahl2).doubleValue();
						break;

					case '÷':
					    try {
					        ergebnis = m1.divid(zahl1, zahl2).doubleValue();
					    } catch (ArithmeticException ex) {
					        v1.showError("Division durch 0 ist nicht erlaubt!");
					        return;
					    }
					    break;
					}					
//				   

					if (ergebnis instanceof Double || ergebnis instanceof Float) {
						res = foramtedNumber(ergebnis);
						v1.updateErgebnisse(res);
					}
					v1.updateErgebnisse(ergebnis.intValue() +"");
				}
				
				if (e.getSource() == v1.clear) {
					v1.eingabe.setText("");
				}

				if (e.getSource() == v1.back) {
					if (letzterText.length() == 0)
						v1.eingabe.setText(letzterText);
					else {
						letzterText = letzterText.substring(0, letzterText.length() - 1);
						v1.eingabe.setText(letzterText);
					}

				}

				letzterText = v1.eingabe.getText();
			}

		};
		
		v1.setAction(actionListener);
	}
	
	private String foramtedNumber(Number n) {
	    if (n.doubleValue() == n.intValue()) {
	        return String.format("%d", n.intValue());  // Für Ganzzahlen
	    } else {
	        return String.format("%.4f", n.doubleValue());  // Für Dezimalzahlen mit 4 Nachkommastellen
	    }
	}
	
	private void checkeOperator() {
		merker = ' ';
		for (int i = 0; i < letzterText.length(); i++)
			for (int j = 0; j < operationen.length; j++)
				if (letzterText.charAt(i) == operationen[j]) {
					merker = operationen[j];
					 System.out.println("Operator gefunden: " + merker);  // Debug-Ausgabe
				}
					
	}

	private void textverteilen() {
		if (merker != ' ') {
			int i = letzterText.indexOf(merker);
			erst = letzterText.substring(0, i);
			last = letzterText.substring(i + 1, letzterText.length());
		}
	}

	public void textToNumber() {
	    try {
	        zahl1 = Double.parseDouble(erst.trim());
	        zahl2 = Double.parseDouble(last.trim());
	    } catch (NumberFormatException e) {
	        v1.showError("Ungültige Eingabe");
	    }
	}

	public void clearTextfield() {
		ActionListener actionListener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {

				if (e.getSource() == v1.clear) {
					v1.eingabe.setText("");
				}
			}
		};

	}

	@Override
	public void actionPerformed(ActionEvent e) {
	}

	public static void main(String[] args) {
		Modell<Number, Number> m = new Modell<>();
		View v = new View();
		Controller n1 = new Controller(m, v);
		
		
	}
}
