package calculations.gui;

import calculations.logic.*;
import hu.elte.inf.pszt.prt.javalib.swingapp.ElteJFrame;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.util.Enumeration;
import javax.swing.*;

public class MainFrame extends ElteJFrame {

protected final String FRAME_TITLE = "Calculations";
private JList<Double> numbersList;
private DefaultListModel<Double> numbersListModel;
private JSpinner numberInputSpinner;
private Calculator<Double> adderCalculator = new AdderCalculator();
private Calculator<Double> multiplierCalculator = new MultiplierCalculator();
private Calculator<Double> meanCalculator = new MeanCalculator();
private Calculator<Double> maxCalculator = new MaxCalculator();

@Override
public void onCreate() {
  setDefaults(FRAME_TITLE);
  numberInputSpinner = new JSpinner(
          new SpinnerNumberModel(.0, Double.NEGATIVE_INFINITY,
                                 Double.POSITIVE_INFINITY, .001));
  numbersListModel = new DefaultListModel<>();
  numbersList = new JList<>(numbersListModel);
  getContentPane().add(new JScrollPane(numbersList), BorderLayout.CENTER);
  JPanel panel = new JPanel();
  panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
  panel.add(new JButton(new CalculatorAction(adderCalculator, "Sum")));
  panel.add(new JButton(new CalculatorAction(multiplierCalculator, "Product")));
  panel.add(new JButton(new CalculatorAction(meanCalculator, "Mean")));
  panel.add(new JButton(new CalculatorAction(maxCalculator, "Max")));
  panel.add(numberInputSpinner);
  panel.add(new JButton(addNumberAction));
  numberInputSpinner.setMaximumSize(new Dimension(1000, 24));
  getContentPane().add(panel, BorderLayout.EAST);
}
private Action addNumberAction = new AbstractAction("Add number") {
@Override
public void actionPerformed(ActionEvent e) {
  //numbersListModel.addElement(Double.valueOf(numberInputSpinner.getModel().getValue().toString()));
  numbersListModel.addElement((double) numberInputSpinner.getModel().getValue());
}
};

private class CalculatorAction extends AbstractAction {

private Calculator<Double> calculator;

public CalculatorAction(Calculator<Double> calc, String name) {
  super(name);
  calculator = calc;
}

@Override
public void actionPerformed(ActionEvent e) {
  Enumeration<Double> numbers = numbersListModel.elements();
  calculator.reset();
  while (numbers.hasMoreElements()) {
    calculator.inject(numbers.nextElement());
  }
  numberInputSpinner.getModel().setValue(calculator.getResult());
}
}
}
