package caltool.view.options;

import caltool.view.BoxPanel;
import caltool.model.options.*;
import mvp.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ViewingListsAppointmentsOptionsPanel extends View {

    public ViewingListsAppointmentsOptionsPanel(
            Screen screen, Options options) {
        super(screen, options);
        maxTextFieldHeight = 1.9;
    }

    public Component compose() {

        BoxPanel outerVbox = BoxPanel.createVerticalBox();
        BoxPanel outerHbox = BoxPanel.createHorizontalBox();
        BoxPanel hbox1 = BoxPanel.createHorizontalBox();
        BoxPanel hbox2 = BoxPanel.createHorizontalBox();
        BoxPanel hbox3 = BoxPanel.createHorizontalBox();
        BoxPanel hbox4 = BoxPanel.createHorizontalBox();
        BoxPanel hbox5 = BoxPanel.createHorizontalBox();
        BoxPanel hbox6 = BoxPanel.createHorizontalBox();
        BoxPanel vbox1 = BoxPanel.createVerticalBox();
        BoxPanel vbox2 = BoxPanel.createVerticalBox();
        BoxPanel vbox3 = BoxPanel.createVerticalBox();
        BoxPanel vbox4 = BoxPanel.createVerticalBox();
        BoxPanel vbox5 = BoxPanel.createVerticalBox();
        BoxPanel vbox6 = BoxPanel.createVerticalBox();
        JLabel label;   

        vbox1.add(label = new JLabel("Show these fields:"));
        label.setAlignmentX(Component.LEFT_ALIGNMENT);
        vbox2.add(titleCheckBox = new JCheckBox("Title"));
        titleCheckBox.setSelected(true);
        vbox2.add(dateCheckBox = new JCheckBox("Date"));
        dateCheckBox.setSelected(true);
        vbox2.add(timeCheckBox = new JCheckBox("Time"));
        timeCheckBox.setSelected(true);
        vbox2.add(durationCheckBox = new JCheckBox("Duration"));
        durationCheckBox.setSelected(true);
        vbox2.add(recursCheckBox = new JCheckBox("Recurs"));
        recursCheckBox.setSelected(true);
        vbox2.setAlignmentY(Component.TOP_ALIGNMENT);

        vbox3.add(categoryCheckBox = new JCheckBox("Category"));
        categoryCheckBox.setSelected(true);
        vbox3.add(locationCheckBox = new JCheckBox("Location"));
        locationCheckBox.setSelected(true);
        vbox3.add(securityCheckBox = new JCheckBox("Security"));
        securityCheckBox.setSelected(true);
        vbox3.add(priorityCheckBox = new JCheckBox("Prioity"));
        priorityCheckBox.setSelected(true);
        vbox3.setAlignmentY(Component.TOP_ALIGNMENT);

        hbox1.add(vbox2);
        hbox1.add(BoxPanel.createHorizontalStrut(10));
        hbox1.add(vbox3);
        hbox1.setAlignmentX(Component.LEFT_ALIGNMENT);
        vbox1.add(hbox1);
        vbox1.setAlignmentY(Component.TOP_ALIGNMENT);

        hbox2.add(new JLabel("Primary sort key: "));
        String[] selections = {"Title", "Date", "Time", "Duration", "Recurs",
            "Category", "Location", "Security", "Priority"};
        hbox2.add(sortKeyCombo = new JComboBox(selections));
        sortKeyCombo.setSelectedItem("Date");
        sortKeyCombo.setMaximumSize(
            new Dimension(
                (int)("Category".length() * sortKeyCombo.getFont().getSize()),
                (int)(maxTextFieldHeight * sortKeyCombo.getFont().getSize())));
        hbox2.setAlignmentX(Component.LEFT_ALIGNMENT);

        hbox3.add(new JLabel("Maximum number of items: "));
        hbox3.add(maxItemsTextField = new JTextField());
        maxItemsTextField.setMaximumSize(
            new Dimension(
                (int)(4 * maxItemsTextField.getFont().getSize()),
                (int)(maxTextFieldHeight *
                    maxItemsTextField.getFont().getSize())));
        hbox3.setAlignmentX(Component.LEFT_ALIGNMENT);

        hbox4.add(new JLabel("Initial display height: "));
        hbox4.add(displayHeightTextField = new JTextField());
        displayHeightTextField.setMaximumSize(
            new Dimension(
                (int)(4 * maxItemsTextField.getFont().getSize()),
                (int)(maxTextFieldHeight *
                    maxItemsTextField.getFont().getSize())));
        hbox4.add(new JLabel(" items"));
        hbox4.setAlignmentX(Component.LEFT_ALIGNMENT);

        hbox5.add(label = new JLabel("Start Date: "));
        label.setAlignmentY(Component.TOP_ALIGNMENT);
        hbox5.add(startDateTextField = new JTextField(" 1"));
        startDateTextField.setMaximumSize(
            new Dimension(
                (int)(3 * startDateTextField.getFont().getSize()),
                (int)(maxTextFieldHeight *
                    startDateTextField.getFont().getSize())));
        /*
         * It seems that Java ignores the following miniumum setting, but we do
         * it in case things ever get better.
         */
        startDateTextField.setMinimumSize(
            new Dimension(
                (int)(3 * startDateTextField.getFont().getSize()),
                (int)(maxTextFieldHeight *
                    startDateTextField.getFont().getSize())));
        String[] selections2 = {"any", "today", "days", "weeks", "months",
            "years", "specific date"};
        startDateTextField.setAlignmentY(Component.TOP_ALIGNMENT);
        hbox5.add(BoxPanel.createHorizontalStrut(4));
        vbox5.add(startDateCombo = new JComboBox(selections2));
        startDateCombo.setSelectedItem("weeks");
        startDateCombo.setMaximumSize(
            new Dimension(
                "specific date".length() * startDateCombo.getFont().getSize(),
                (int)(maxTextFieldHeight *
                    startDateCombo.getFont().getSize())));
        startDateCombo.setAlignmentX(Component.LEFT_ALIGNMENT);
        String[] selections3 = {"ago", "from now"};
        vbox5.add(startDateDirectionCombo = new JComboBox(selections3));
        startDateDirectionCombo.setMaximumSize(
            new Dimension(
                "from now".length() *
                    startDateDirectionCombo.getFont().getSize(),
                (int)((maxTextFieldHeight + 0.5) *   // Unknown why 0.5 fudge
                                                     // factor is needed
                    startDateDirectionCombo.getFont().getSize())));
        startDateDirectionCombo.setAlignmentX(Component.LEFT_ALIGNMENT);
        vbox5.setAlignmentY(Component.TOP_ALIGNMENT);
        hbox5.add(vbox5);
        hbox5.setAlignmentX(Component.LEFT_ALIGNMENT);

        /*
         * The following doesn't work right yet.
         *
        startDateTextField.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (Integer.parseInt(startDateTextField.getText()) == 1) {
                        String item = (String)startDateCombo.getSelectedItem();
                        if (item.equals("days")) {
                            startDateCombo.setEditable(true);
                            startDateCombo.setSelectedItem("day");
                            startDateCombo.setEditable(false);
                        }
                        if (item.equals("weeks")) {
                            startDateCombo.setEditable(true);
                            startDateCombo.setSelectedItem("week");
                            startDateCombo.setEditable(false);
                        }
                        if (item.equals("months")) {
                            startDateCombo.setEditable(true);
                            startDateCombo.setSelectedItem("month");
                            startDateCombo.setEditable(false);
                        }
                        if (item.equals("years")) {
                            startDateCombo.setEditable(true);
                            startDateCombo.setSelectedItem("year");
                            startDateCombo.setEditable(false);
                        }
                    }
                }
            }
        );
         *
         */

        startDateCombo.addItemListener(
            new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    String item = (String) e.getItem();
                    System.out.println(item);
                    /*
                     * The logic here may not be optimal, but other versions
                     * have been tried without success.  The trick is to avoid
                     * having to check for equality with specific date strings.
                     */
                    if (item.equals("days") || item.equals("months") || 
                            item.equals("weeks") || item.equals("years")) {
                        startDateTextField.setEnabled(true);
                        startDateTextField.setText("");
                        startDateDirectionCombo.setEnabled(true);
                        startDateCombo.setEditable(false);
                    }
                    else {
                        startDateTextField.setEnabled(false);
                        startDateDirectionCombo.setEnabled(false);
                        startDateTextField.setText("");
                    }
                    if (item.equals("any") || item.equals("today")) {
                        startDateCombo.setEditable(false);
                    }
                    if (item.equals("specific date") && !specificSelected) {
                        startDateCombo.setEditable(true);
                        startDateCombo.getEditor().selectAll();
                        specificSelected = true;
                        /*
                         * BTW, the following code leads to infinite recursion.
                        startDateCombo.setSelectedItem("--enter date--");
                         */
                    } else {
                        specificSelected = false;
                    }
                }
                protected boolean specificSelected = false;
            }
        );

        hbox6.add(label = new JLabel("End Date: "));
        label.setAlignmentY(Component.TOP_ALIGNMENT);
        hbox6.add(endDateTextField = new JTextField(" 1"));
        endDateTextField.setMaximumSize(
            new Dimension(
                (int)(3 * endDateTextField.getFont().getSize()),
                (int)(maxTextFieldHeight *
                    endDateTextField.getFont().getSize())));
        endDateTextField.setAlignmentY(Component.TOP_ALIGNMENT);
        hbox6.add(BoxPanel.createHorizontalStrut(4));
        vbox6.add(endDateCombo = new JComboBox(selections2));
        endDateCombo.setSelectedItem("weeks");
        endDateCombo.setMaximumSize(
            new Dimension(
                "specific date".length() * endDateCombo.getFont().getSize(),
                (int)(maxTextFieldHeight *
                    endDateCombo.getFont().getSize())));
        endDateCombo.setAlignmentX(Component.LEFT_ALIGNMENT);
        vbox6.add(endDateDirectionCombo = new JComboBox(selections3));

        endDateDirectionCombo.setMaximumSize(
            new Dimension(
                "from now".length() *
                    endDateDirectionCombo.getFont().getSize(),
                (int)((maxTextFieldHeight + 0.5) *   // Unknown why 0.75 fudge
                                                     // factor is needed
                    endDateDirectionCombo.getFont().getSize())));
        endDateDirectionCombo.setAlignmentX(Component.LEFT_ALIGNMENT);
        vbox6.add(BoxPanel.createVerticalStrut(10));
        vbox6.setAlignmentY(Component.TOP_ALIGNMENT);
        hbox6.add(vbox6);
        hbox6.setAlignmentX(Component.LEFT_ALIGNMENT);

        vbox4.add(hbox2);
        vbox4.add(BoxPanel.createVerticalStrut(10));
        vbox4.add(hbox3);
        vbox4.add(BoxPanel.createVerticalStrut(10));
        vbox4.add(hbox4);
        vbox4.add(BoxPanel.createVerticalStrut(10));
        vbox4.add(hbox5);
        vbox4.add(BoxPanel.createVerticalStrut(10));
        vbox4.add(hbox6);
        vbox4.add(BoxPanel.createVerticalStrut(10));
        vbox4.setAlignmentY(Component.TOP_ALIGNMENT);

        outerHbox.add(BoxPanel.createHorizontalStrut(30));
        outerHbox.add(BoxPanel.createHorizontalGlue());
        outerHbox.add(vbox1);
        outerHbox.add(BoxPanel.createHorizontalStrut(20));
        outerHbox.add(BoxPanel.createHorizontalGlue());
        outerHbox.add(vbox4);
        outerHbox.add(BoxPanel.createHorizontalStrut(30));
        outerHbox.add(BoxPanel.createHorizontalGlue());

        outerVbox.add(BoxPanel.createVerticalStrut(30));
        outerHbox.add(BoxPanel.createVerticalGlue());
        outerVbox.add(outerHbox);
        outerVbox.add(BoxPanel.createVerticalStrut(30));
        outerHbox.add(BoxPanel.createVerticalGlue());

        return (widget = outerVbox);

    }

    JCheckBox titleCheckBox;
    JCheckBox dateCheckBox;
    JCheckBox timeCheckBox;
    JCheckBox durationCheckBox;
    JCheckBox recursCheckBox;
    JCheckBox categoryCheckBox;
    JCheckBox locationCheckBox;
    JCheckBox securityCheckBox;
    JCheckBox priorityCheckBox;
    JComboBox sortKeyCombo;
    JTextField maxItemsTextField;
    JTextField displayHeightTextField;
    JTextField startDateTextField;
    JComboBox startDateCombo;
    JComboBox startDateDirectionCombo;
    JTextField endDateTextField;
    JComboBox endDateCombo;
    JComboBox endDateDirectionCombo;

    /** The max height of a text field */
    protected final double maxTextFieldHeight;


}
