/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ctecinf.swing;

import br.com.ctecinf.Config;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.plaf.TabbedPaneUI;
import javax.swing.plaf.basic.BasicTabbedPaneUI;

/**
 *
 * @author Cássio Conceição
 * @since 19/09/2018
 * @version 201809
 * @see http://ctecinf.com.br
 */
public class TabbedPane extends JTabbedPane {

    private List<Component> closables = new ArrayList();

    protected ImageIcon logo() {

        String path = Config.get("logo.path");

        if (path != null) {
            try {
                BufferedImage img = ImageIO.read(new File(path));
                return new ImageIcon(img);
            } catch (IOException ex) {
                System.err.println(ex);
            }
        }

        return Image.parse(Image.LOGO);
    }

    public TabbedPane() {
        init();
    }

    private void init() {

        final JPanel panel = new JPanel() {

            @Override
            protected void paintComponent(Graphics g) {

                super.paintComponent(g);

                StringBuilder sb = new StringBuilder();
                sb.append(Image.BACKGROUND_PART1);
                sb.append(Image.BACKGROUND_PART2);
                sb.append(Image.BACKGROUND_PART3);
                sb.append(Image.BACKGROUND_PART4);
                sb.append(Image.BACKGROUND_PART5);
                sb.append(Image.BACKGROUND_PART6);
                sb.append(Image.BACKGROUND_PART7);

                java.awt.Image bg = Image.parse(sb.toString()).getImage();

                g.drawImage(bg, 0, 0, null);

                java.awt.Image img = Image.parse(Image.LOGO, 250).getImage();

                BufferedImage buff = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);

                Graphics2D g2d = (Graphics2D) buff.getGraphics();

                AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.35f);
                g2d.setComposite(alphaChannel);
                g2d.drawImage(img, 0, 0, null);

                g.drawImage(buff, super.getWidth() - 255, super.getHeight() - 110, null);

                java.awt.Image logo = logo().getImage();

                g.drawImage(logo, super.getWidth() / 2 - (logo.getWidth(null) / 2), super.getHeight() / 2 - (logo.getHeight(null) / 2), null);
            }
        };
        panel.setBorder(null);

        addTab("", panel);
        setEnabledAt(0, false);

        TabbedPaneUI tabbedPaneUI = new BasicTabbedPaneUI() {
            @Override
            protected int calculateTabAreaHeight(int tabPlacement, int horizRunCount, int maxTabHeight) {
                if (getTabCount() > 1) {
                    return super.calculateTabAreaHeight(tabPlacement, horizRunCount, maxTabHeight);
                } else {
                    return 0;
                }
            }
        };

        setUI(tabbedPaneUI);
    }

    public Component add(String title, Component panel, boolean closable) {
        return add(title, panel, null, closable);
    }

    public Component add(String title, Component panel, ImageIcon icon) {
        return add(title, panel, icon, true);
    }

    public Component add(String title, final Component panel, ImageIcon icon, boolean closable) {

        JPanel pane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
        pane.setBackground(new Color(255, true));
        pane.setOpaque(true);

        JLabel label = new JLabel(title, icon, JLabel.LEFT);
        label.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 10));
        pane.add(label);

        if (closable) {

            JButton closeButton = new JButton(Image.parse(Image.CLOSE_TAB));
            closeButton.setToolTipText("Clique para fechar a aba");
            closeButton.setBackground(new Color(255, true));
            closeButton.setBorder(BorderFactory.createCompoundBorder(null, BorderFactory.createEmptyBorder(2, 0, 0, 0)));
            closeButton.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    closables.remove(panel);
                    remove(panel);
                }
            });

            pane.add(closeButton);
            closables.add(panel);
        }

        Component comp = super.add(panel);

        if (indexOfComponent(panel) > -1) {
            setTabComponentAt(indexOfComponent(panel), pane);
            setSelectedComponent(comp);
        }

        return comp;
    }

    @Override
    public Component add(String title, Component component) {
        return this.add(title, component, null, true);
    }

    public void removeAllTabsClosable() {

        for (Component pane : closables) {
            remove(pane);
        }

        closables = new ArrayList();
    }
}
