package bankaccounts.gui;

import bankaccounts.logic.BankAccount;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
 * Készítsünk grafikus felhasználói felületet a korábban készített, bankszámlát
 * kezelő osztályhoz. A program ne csak 1 bankszámlát legyen képes kezelni,
 * hanem tetszőleges számút, és minden bankszámlához rendelje hozzá a
 * tulajdonosának nevét is! Egy számlatulajdonosi névhez legfeljebb egy számlát
 * rendeljünk. A bankszámlák adatait kezelő programrész különüljön el a
 * megjelenítést és a vezérlést végző részektől (letölthető innen).
 *
 * A grafikus felület rendelkezzen az alábbiakkal: - egy listában jelenjen meg a
 * számlatulajdonosok neve és egyenlege, - a listából kiválasztott számla minden
 * adata jelenjen meg egy panelon, azaz a számla tulajdonosának neve, a számla
 * egyenlege, és a számlatörténetben szereplő tételek listája (előjelesen),
 * valamint itt legyen lehetőség pénz betét, -kivét bonyolítására is. - egy
 * eszköztárban és/vagy menüben legyen lehetőség új számla felvételére, új
 * számlarendszer kezdésére, korábban létrehozott számlarendszer betöltésére és
 * az aktuális számlarendszer elmentésére is.
 *
 * @author Daniel "3ICE" Berezvai
 */
public class BankFrame extends JFrame {

  private static final String NAME_LABEL_TEXT = "Bank account owner's name: ";
  private static final String BALANCE_LABEL_TEXT = "Balance: ";
  private JList<BankAccount> accountList;
  private DefaultListModel<BankAccount> accountModel;
  private JLabel nameLabel, balanceLabel;
  private JList<Integer> historyList;
  private JSpinner amountSpinner;
  private Action depositAction, withdrawalAction;
  private ListSelectionListener accountListSelectionListener;

  public BankFrame() {
    setTitle("3ICE's Bank");
    setLocationByPlatform(true); //Get placed by OS
//    setLocationRelativeTo(null); //Alternatively: Center
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    accountList = new JList<>();
    accountModel = new DefaultListModel<>();
    accountList.setModel(accountModel);

    createEventListeners();
    accountList.addListSelectionListener(accountListSelectionListener);
    createMenuBar();
    createToolBar();
    getContentPane().add(new JScrollPane(accountList), BorderLayout.WEST);

    nameLabel = new JLabel(NAME_LABEL_TEXT + " ?");
    balanceLabel = new JLabel(BALANCE_LABEL_TEXT + "?");
    historyList = new JList<>();
    amountSpinner = new JSpinner(new SpinnerNumberModel(0, 0, null, 5));

    JPanel detailsPane = new JPanel();
    detailsPane.setLayout(new BoxLayout(detailsPane, BoxLayout.Y_AXIS));
    detailsPane.add(nameLabel);
    detailsPane.add(balanceLabel);
    detailsPane.add(amountSpinner);
    JPanel twoButtonsSideBySide = new JPanel();
    twoButtonsSideBySide.setLayout(new FlowLayout());
    twoButtonsSideBySide.add(new JButton(depositAction));
    twoButtonsSideBySide.add(new JButton(withdrawalAction));
    detailsPane.add(twoButtonsSideBySide);
    detailsPane.add(new JScrollPane(historyList));
    getContentPane().add(detailsPane);

    pack(); //Resize to minimal.
  }
  private Action newBankAccountAction;

  private void createMenuBar() {
    JMenuBar mb = new JMenuBar();
    JMenu menu = new JMenu("Bank");
    mb.add(menu);
    menu.add(new JMenuItem(newBankAccountAction));
    setJMenuBar(mb);
  }

  private void createToolBar() {
    JToolBar tb = new JToolBar();
    getContentPane().add(tb, BorderLayout.NORTH);
    tb.add(newBankAccountAction);
  }

  private void createEventListeners() {
    newBankAccountAction = new AbstractAction("New Bank Account") {
      public void actionPerformed(ActionEvent e) {
        String nameOfOwner = JOptionPane.showInputDialog(rootPane,
                "Name of new bank account owner", "Name",
                JOptionPane.QUESTION_MESSAGE);
        if (nameOfOwner != null) {//Did not click Cancel
          BankAccount bankAccount = new BankAccount();
          bankAccount.setNameOfOwner(nameOfOwner);
          accountModel.addElement(bankAccount);
          pack();
        }
      }
    };
    accountListSelectionListener = new ListSelectionListener() {
      public void valueChanged(ListSelectionEvent e) {
        BankAccount selectedAccount = accountList.getSelectedValue();
        nameLabel.setText(NAME_LABEL_TEXT + selectedAccount.getNameOfOwner());
        balanceLabel.setText(BALANCE_LABEL_TEXT + selectedAccount.getBalance());
        amountSpinner.setValue(0);
        DefaultListModel<Integer> historyListModel = new DefaultListModel<>();
        for (Integer i : selectedAccount.getHistory()) {
          historyListModel.addElement(i);
        }
        historyList.setModel(historyListModel);
        depositAction.setEnabled(true);
        withdrawalAction.setEnabled(true);
        pack();
      }
    };
    depositAction = new AbstractAction("Deposit") {
      public void actionPerformed(ActionEvent e) {
        depositToSelectedAccount(1);
      }
    };
    withdrawalAction = new AbstractAction("Withdraw") {
      public void actionPerformed(ActionEvent e) {
        depositToSelectedAccount(-1);
      }
    };
    depositAction.setEnabled(false);
    withdrawalAction.setEnabled(false);
  }

  private void depositToSelectedAccount(int multiplier) {
    BankAccount selectedAccount = accountList.getSelectedValue();
    selectedAccount.deposit((int) amountSpinner.getValue() * multiplier);
    accountListSelectionListener.valueChanged(null);
    accountList.repaint();
    pack();
  }
}
