package com.badlogic.gdx.tools.flame;

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.FileTextureData;
import com.badlogic.gdx.utils.Array;

/** @author Inferno */
public class TextureAtlasPanel extends JPanel {
	JPanel regionsPanel;
	TextureAtlas atlas;
	
	public TextureAtlasPanel(){
		initializeComponents();
	}

	private void initializeComponents () {
		setLayout(new GridBagLayout());
		JButton backwardButton, forwardButton;
		
		add(backwardButton = new JButton("<"), new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
			new Insets(0, 0, 0, 0), 0, 0));
		add(regionsPanel = new JPanel(), new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
			new Insets(0, 0, 0, 0), 0, 0));
		add(forwardButton = new JButton(">"), new GridBagConstraints(2, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
			new Insets(0, 0, 0, 0), 0, 0));
		
		regionsPanel.setLayout(new CustomCardLayout());
		
		backwardButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed (ActionEvent arg0) {
				if(atlas == null) return;
				CustomCardLayout layout = (CustomCardLayout)regionsPanel.getLayout();
				layout.previous(regionsPanel);
			}
		});
		
		forwardButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed (ActionEvent arg0) {
				if(atlas == null) return;
				CustomCardLayout layout = (CustomCardLayout)regionsPanel.getLayout();
				layout.next(regionsPanel);
			}
		});	
	}
	
	public void setAtlas(TextureAtlas atlas){
		if(atlas == this.atlas) return;
		regionsPanel.removeAll();
		 Array<AtlasRegion> atlasRegions = atlas.getRegions();
		 CustomCardLayout layout = (CustomCardLayout)regionsPanel.getLayout();
		Array<TextureRegion> regions = new Array<TextureRegion>();
		for(Texture texture : atlas.getTextures()){
			FileTextureData file = (FileTextureData)texture.getTextureData();
			regionsPanel.add(new TexturePanel( texture, getRegions(texture, atlasRegions, regions)));
		}
		layout.first(regionsPanel);
		this.atlas = atlas;
	}
	
	protected Array<TextureRegion> getRegions (Texture texture, Array<AtlasRegion> atlasRegions, Array<TextureRegion> out) {
		out.clear();
		for(TextureRegion region : atlasRegions){
			if(region.getTexture() == texture)
				out.add(region);
		}
		return out;
	}

	public Array<TextureRegion> getSelectedRegions () {
		CustomCardLayout layout = (CustomCardLayout)regionsPanel.getLayout();
		TexturePanel panel = getCurrentRegionPanel();
		return panel.selectedRegions;
	}
	
	public TexturePanel getCurrentRegionPanel(){
		CustomCardLayout layout = (CustomCardLayout)regionsPanel.getLayout();
		return layout.getCurrentCard(regionsPanel);
	}

	public void clearSelection () {
		for(Component regionPanel : regionsPanel.getComponents())
			((TexturePanel)regionPanel).clearSelection();
	}
	
}
