// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.trustosm.gui.dialogs;

import static org.openstreetmap.josm.tools.I18n.tr;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Iterator;

import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;

import org.bouncycastle.openpgp.PGPPublicKey;
import org.bouncycastle.openpgp.PGPSignature;
import org.openstreetmap.josm.tools.GBC;
import org.openstreetmap.josm.tools.ImageProvider;

public class KeySignaturesDialog extends JPanel {

    protected boolean isCollapsed;

    protected TitleBar titleBar;

    /** the label in the title bar which shows whether the toggle dialog is expanded or collapsed */
    private JLabel lblMinimized;

    public KeySignaturesDialog(PGPPublicKey key) {
        super(new BorderLayout());

        String userid = "Unknown";
        Iterator<?> iter = key.getUserIDs();
        if (iter.hasNext()) {
            userid = (String) iter.next();
        }

        isCollapsed = false;

        titleBar = new TitleBar(userid);
        add(titleBar, BorderLayout.NORTH);
        add(createKeySigPanel(key));

    }

    public static JPanel createKeySigPanel(PGPPublicKey key) {
        JPanel p = new JPanel();
        p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
        Iterator<?> iter = key.getSignatures();
        while (iter.hasNext()) {
            PGPSignature sig = (PGPSignature) iter.next();
            String uid = "0x"+Long.toHexString(sig.getKeyID()).substring(8).toUpperCase();
            p.add(new JLabel(uid));
        }
        return p;
    }

    /**
     * Collapses the toggle dialog to the title bar only
     *
     */
    public void collapse() {
        if (!isCollapsed) {
            //setContentVisible(false);
            isCollapsed = true;
            setPreferredSize(new Dimension(0, 20));
            setMaximumSize(new Dimension(Integer.MAX_VALUE, 20));
            setMinimumSize(new Dimension(Integer.MAX_VALUE, 20));
            lblMinimized.setIcon(ImageProvider.get("misc", "minimized"));
        } else throw new IllegalStateException();
    }

    /**
     * Expands the toggle dialog
     */
    protected void expand() {
        if (isCollapsed) {
            //        setContentVisible(true);
            isCollapsed = false;
            setPreferredSize(new Dimension(0, 200));
            setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
            lblMinimized.setIcon(ImageProvider.get("misc", "normal"));
        } else throw new IllegalStateException();
    }

    /**
     * Sets the visibility of all components in this toggle dialog, except the title bar
     *
     * @param visible true, if the components should be visible; false otherwise
     */
    protected void setContentVisible(boolean visible) {
        Component[] comps = getComponents();
        for (int i = 0; i < comps.length; i++) {
            if (comps[i] != titleBar) {
                comps[i].setVisible(visible);
            }
        }
    }

    /**
     * The title bar displayed in docked mode
     */
    protected class TitleBar extends JPanel {
        private final JLabel lblTitle;

        public TitleBar(String toggleDialogName) {
            setLayout(new GridBagLayout());
            lblMinimized = new JLabel(ImageProvider.get("misc", "minimized"));
            add(lblMinimized);

            lblTitle = new JLabel(toggleDialogName);
            add(lblTitle, GBC.std().fill(GBC.HORIZONTAL));

            addMouseListener(
                    new MouseAdapter() {
                        @Override
                        public void mouseClicked(MouseEvent e) {
                            // toggleExpandedState
                            if (isCollapsed) {
                                expand();
                            } else {
                                collapse();
                            }
                        }
                    }
           );

            setToolTipText(tr("Click to minimize/maximize the panel content"));
            setTitle(toggleDialogName);
        }

        public void setTitle(String title) {
            lblTitle.setText(title);
        }

        public String getTitle() {
            return lblTitle.getText();
        }
    }

}
