/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.ki.samples.spring.ui;

import org.apache.ki.authz.AuthorizationException;
import org.ki.samples.spring.DefaultSampleManager;
import org.ki.samples.spring.SampleManager;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.ClassPathResource;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


/**
 * Simple web start application that helps to demo single sign-on and
 * remoting authorization using Apache Ki.  The injected <tt>SampleManager</tt>
 * is hosted by the Spring sample web application and remotely invoked
 * when the buttons in this view are clicked.
 *
 * @author Jeremy Haile
 * @since 0.1
 */
public class WebStartView implements ActionListener, InitializingBean {

    /*--------------------------------------------
    |             C O N S T A N T S             |
    ============================================*/

    /*--------------------------------------------
    |    I N S T A N C E   V A R I A B L E S    |
    ============================================*/
    private SampleManager sampleManager;
    private JTextField valueField;
    private JButton saveButton;
    private JButton refreshButton;
    private JButton secureMethod1Button;
    private JButton secureMethod2Button;
    private JButton secureMethod3Button;
    private JFrame frame;

    /*--------------------------------------------
    |         C O N S T R U C T O R S           |
    ============================================*/

    /*--------------------------------------------
    |  A C C E S S O R S / M O D I F I E R S    |
    ============================================*/

    public void setSampleManager(SampleManager sampleManager) {
        this.sampleManager = sampleManager;
    }

    /*--------------------------------------------
    |               M E T H O D S               |
    ============================================*/
    public void afterPropertiesSet() throws Exception {
        ClassPathResource resource = new ClassPathResource("logo.png");
        ImageIcon icon = new ImageIcon(resource.getURL());
        JLabel logo = new JLabel(icon);

        valueField = new JTextField(20);
        updateValueLabel();

        saveButton = new JButton("Save Value");
        saveButton.addActionListener(this);

        refreshButton = new JButton("Refresh Value");
        refreshButton.addActionListener(this);

        JPanel valuePanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        valuePanel.add(valueField);
        valuePanel.add(saveButton);
        valuePanel.add(refreshButton);

        secureMethod1Button = new JButton("Method #1");
        secureMethod1Button.addActionListener(this);

        secureMethod2Button = new JButton("Method #2");
        secureMethod2Button.addActionListener(this);

        secureMethod3Button = new JButton("Method #3");
        secureMethod3Button.addActionListener(this);

        JPanel methodPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        methodPanel.add(secureMethod1Button);
        methodPanel.add(secureMethod2Button);
        methodPanel.add(secureMethod3Button);

        frame = new JFrame("Apache Ki Sample Application");
        frame.setSize(500, 200);

        Container panel = frame.getContentPane();
        panel.setLayout(new BorderLayout());
        panel.add(logo, BorderLayout.NORTH);
        panel.add(valuePanel, BorderLayout.CENTER);
        panel.add(methodPanel, BorderLayout.SOUTH);

        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    private void updateValueLabel() {
        valueField.setText(sampleManager.getValue());
    }

    public void actionPerformed(ActionEvent e) {
        try {

            if (e.getSource() == saveButton) {
                sampleManager.setValue(valueField.getText());

            } else if (e.getSource() == refreshButton) {
                updateValueLabel();

            } else if (e.getSource() == secureMethod1Button) {
                sampleManager.secureMethod1();
                JOptionPane.showMessageDialog(frame, "Method #1 successfully called.", "Success", JOptionPane.INFORMATION_MESSAGE);

            } else if (e.getSource() == secureMethod2Button) {
                sampleManager.secureMethod2();
                JOptionPane.showMessageDialog(frame, "Method #2 successfully called.", "Success", JOptionPane.INFORMATION_MESSAGE);
            } else if (e.getSource() == secureMethod3Button) {
                sampleManager.secureMethod3();
                JOptionPane.showMessageDialog(frame, "Method #3 successfully called.", "Success", JOptionPane.INFORMATION_MESSAGE);

            } else {
                throw new RuntimeException("Unexpected action event from source: " + e.getSource());
            }

        } catch (AuthorizationException ae) {
            JOptionPane.showMessageDialog(frame, "Unauthorized to perform action: " + ae.getMessage(), "Unauthorized", JOptionPane.WARNING_MESSAGE);
        }
    }

    public static void main(String[] args) throws Exception {
        WebStartView test = new WebStartView();
        test.setSampleManager(new DefaultSampleManager());
        test.afterPropertiesSet();
    }


}
