package eu.dnetlib.client.leftColumn;

import java.util.ArrayList;

import com.github.gwtbootstrap.client.ui.AccordionGroup;
import com.github.gwtbootstrap.client.ui.Form;
import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.constants.FormType;
import com.github.gwtbootstrap.client.ui.constants.IconType;
import com.github.gwtbootstrap.client.ui.event.HideEvent;
import com.github.gwtbootstrap.client.ui.event.HideHandler;
import com.github.gwtbootstrap.client.ui.event.ShowEvent;
import com.github.gwtbootstrap.client.ui.event.ShowHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;

import eu.dnetlib.client.Generate;
import eu.dnetlib.client.widgets.FormFieldSet;
import eu.dnetlib.shared.ValuesOfFields;

public class AppearancePanel implements IsWidget {

	private FlowPanel flowPanel = new FlowPanel();
	
	private ArrayList<AccordionGroup> appearancePanels = new ArrayList<AccordionGroup>();
	
	public ArrayList<AccordionGroup> getAppearancePanels() {
		return appearancePanels;
	}


	public interface ChangingNameListener{
		public void onEvent(String name);
	}
	
	private ChangingNameListener changingNameListener;
	
	public void setChaningNameListenr(ChangingNameListener changingNameListener){
		this.changingNameListener = changingNameListener;
	}
	
	public AppearancePanel() {
		
		
		designAppearance();
		designSpacing();
	}
	
	public void designAppearance(){
		
		designAppearanceForTitle();
		designAppearanceForSubtitle();
		designAppearanceForXaxis();
		designAppearanceForYaxis();
		
	}
	
	public void addAppearanceForDataserie(final int numberOfColumn){
		
		final AccordionGroup appearanceGroupPanel = new AccordionGroup();
		appearancePanels.add(appearanceGroupPanel);
		
		Form appearanceForm = new Form();
		appearanceForm.setType(FormType.HORIZONTAL);
		
		
		final TextBox nameOfDataseries = new TextBox();	
		FormFieldSet nameOf = new FormFieldSet("Name of dataseries", nameOfDataseries);
		nameOfDataseries.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				if(changingNameListener!=null){
					changingNameListener.onEvent(nameOfDataseries.getText());
				}
				if(!nameOfDataseries.getText().equals("")){
					appearanceGroupPanel.setHeading("APPEARANCE FOR " + "\""+nameOfDataseries.getText()+"\"");
					
				}else{
					appearanceGroupPanel.setHeading("APPEARANCE FOR DATASERIES " + (numberOfColumn+1));
				}
				ValuesOfFields.getInstance().getColumnsDataList().get(numberOfColumn).setXaxisTitle(nameOfDataseries.getText());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		
		
		appearanceForm.add(nameOf);
		
		 
			 appearanceGroupPanel.addStyleName("accordionPanel");
			 appearanceGroupPanel.setHeading("APPEARANCE FOR DATASERIES "+(numberOfColumn+1));
			 appearanceGroupPanel.getHeading().addStyleName("accordionHeading");
			 appearanceGroupPanel.add(appearanceForm);
			 appearanceGroupPanel.setIcon(IconType.PLUS);
			 appearanceGroupPanel.setDefaultOpen(false);
			 appearanceGroupPanel.addShowHandler(new ShowHandler() {
	            @Override
	            public void onShow(ShowEvent showEvent) {
	            	appearanceGroupPanel.setIcon(IconType.MINUS);
	            }
	         });
			 
			 appearanceGroupPanel.addHideHandler(new HideHandler() {
	            @Override
	            public void onHide(HideEvent hideEvent) {
	            	appearanceGroupPanel.setIcon(IconType.PLUS);
	            }
	         });
			 
		flowPanel.add(appearanceGroupPanel);	 
	}
	
	public void deleteAppearanceOfDataseries(int deletedColumn){
		flowPanel.remove(appearancePanels.get(deletedColumn));
		appearancePanels.remove(deletedColumn);
	}
	
	public void designSpacing(){
		
		Form borderOptionsForm = new Form();
		borderOptionsForm.setType(FormType.HORIZONTAL);
		
		final TextBox spaceTopTextBox = new TextBox();
		FormFieldSet spaceTopFieldSet = new FormFieldSet("Space from top", spaceTopTextBox);
		spaceTopTextBox.getElement().setAttribute("type", "number");
		spaceTopTextBox.setText("5");
		spaceTopTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setSpacingTop(Integer.parseInt(spaceTopTextBox.getText()));
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),1);
			}
		});
		
		final TextBox spaceBottomTextBox = new TextBox();
		FormFieldSet spaceBottomFieldSet = new FormFieldSet("Space from bottom", spaceBottomTextBox);
		spaceBottomTextBox.getElement().setAttribute("type", "number");
		spaceBottomTextBox.setText("0");
		spaceBottomTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setSpacingBottom(Integer.parseInt(spaceBottomTextBox.getText()));
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),1);
			}
		});
		
		final TextBox spaceLeftTextBox = new TextBox();
		FormFieldSet spaceLeftFieldSet = new FormFieldSet("Space from left", spaceLeftTextBox);
		spaceLeftTextBox.getElement().setAttribute("type", "number");
		spaceLeftTextBox.setText("0");
		spaceLeftTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setSpacingLeft(Integer.parseInt(spaceLeftTextBox.getText()));
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),1);
			}
		});
		
		final TextBox spaceRightTextBox = new TextBox();
		FormFieldSet spaceRightFieldSet = new FormFieldSet("Space from right", spaceRightTextBox);
		spaceRightTextBox.getElement().setAttribute("type", "number");
		spaceRightTextBox.setText("0");
		spaceRightTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setSpacingRight(Integer.parseInt(spaceRightTextBox.getText()));
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),1);
			}
		});
		borderOptionsForm.add(spaceTopFieldSet);
		borderOptionsForm.add(spaceBottomFieldSet);
		borderOptionsForm.add(spaceRightFieldSet);
		borderOptionsForm.add(spaceLeftFieldSet);
		
		
		final AccordionGroup borderOptionsGroupPanel = new AccordionGroup();
        borderOptionsGroupPanel.addStyleName("accordionPanel");
        borderOptionsGroupPanel.setHeading("SPACING");
        borderOptionsGroupPanel.getHeading().addStyleName("accordionHeading");
        borderOptionsGroupPanel.add(borderOptionsForm);
        borderOptionsGroupPanel.setIcon(IconType.MINUS);
        borderOptionsGroupPanel.setDefaultOpen(true);
        borderOptionsGroupPanel.addShowHandler(new ShowHandler() {
            @Override
            public void onShow(ShowEvent showEvent) {
                borderOptionsGroupPanel.setIcon(IconType.MINUS);
            }
        });
        
        borderOptionsGroupPanel.addHideHandler(new HideHandler() {
            @Override
            public void onHide(HideEvent hideEvent) {
                borderOptionsGroupPanel.setIcon(IconType.PLUS);
            }
        });
		
        
        flowPanel.add(borderOptionsGroupPanel);
	}
	
	public void designAppearanceForTitle(){
		Form appearanceOptionsForm = new Form();
		appearanceOptionsForm.setType(FormType.HORIZONTAL);
		
		final TextBox textColorTextBox = new TextBox();
		FormFieldSet textColorFieldSet = new FormFieldSet("Text color", textColorTextBox);
		textColorTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setColorTitle(textColorTextBox.getText());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		
		final TextBox fontSizeTextBox = new TextBox();
		fontSizeTextBox.getElement().setAttribute("type", "number");
		fontSizeTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setSizeTitle(fontSizeTextBox.getText());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		
		FormFieldSet fontSizeFieldSet = new FormFieldSet("Font size", fontSizeTextBox);
		

		
		appearanceOptionsForm.add(textColorFieldSet);
		appearanceOptionsForm.add(fontSizeFieldSet);
		
		
		final AccordionGroup appearanceOptionsGroupPanel = new AccordionGroup();
        appearanceOptionsGroupPanel.addStyleName("accordionPanel");
        appearanceOptionsGroupPanel.setHeading("TITLE");
        appearanceOptionsGroupPanel.getHeading().addStyleName("accordionHeading");
        appearanceOptionsGroupPanel.add(appearanceOptionsForm);
        appearanceOptionsGroupPanel.setIcon(IconType.PLUS);
        appearanceOptionsGroupPanel.setDefaultOpen(false);
        appearanceOptionsGroupPanel.addShowHandler(new ShowHandler() {
            @Override
            public void onShow(ShowEvent showEvent) {
                appearanceOptionsGroupPanel.setIcon(IconType.MINUS);
            }
        });
        appearanceOptionsGroupPanel.addHideHandler(new HideHandler() {
            @Override
            public void onHide(HideEvent hideEvent) {
                appearanceOptionsGroupPanel.setIcon(IconType.PLUS);
            }
        });
		
        
        flowPanel.add(appearanceOptionsGroupPanel);
	}
	
	public void designAppearanceForSubtitle(){
		Form appearanceOptionsForm = new Form();
		appearanceOptionsForm.setType(FormType.HORIZONTAL);
		
		final TextBox textColorTextBox = new TextBox();
		FormFieldSet textColorFieldSet = new FormFieldSet("Text color", textColorTextBox);
		textColorTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setColorSubtitle(textColorTextBox.getText());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		
		final TextBox fontSizeTextBox = new TextBox();
		fontSizeTextBox.getElement().setAttribute("type", "number");
		fontSizeTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setSizeSubtitle(fontSizeTextBox.getText());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		
		FormFieldSet fontSizeFieldSet = new FormFieldSet("Font size", fontSizeTextBox);
		
		
		appearanceOptionsForm.add(textColorFieldSet);
		appearanceOptionsForm.add(fontSizeFieldSet);
		
		
		final AccordionGroup appearanceOptionsGroupPanel = new AccordionGroup();
        appearanceOptionsGroupPanel.addStyleName("accordionPanel");
        appearanceOptionsGroupPanel.setHeading("SUBTITLE");
        appearanceOptionsGroupPanel.getHeading().addStyleName("accordionHeading");
        appearanceOptionsGroupPanel.add(appearanceOptionsForm);
        appearanceOptionsGroupPanel.setIcon(IconType.PLUS);
        appearanceOptionsGroupPanel.setDefaultOpen(false);
        appearanceOptionsGroupPanel.addShowHandler(new ShowHandler() {
            @Override
            public void onShow(ShowEvent showEvent) {
                appearanceOptionsGroupPanel.setIcon(IconType.MINUS);
            }
        });
        appearanceOptionsGroupPanel.addHideHandler(new HideHandler() {
            @Override
            public void onHide(HideEvent hideEvent) {
                appearanceOptionsGroupPanel.setIcon(IconType.PLUS);
            }
        });
		
        
        flowPanel.add(appearanceOptionsGroupPanel);
	}
	
	public void designAppearanceForXaxis(){
		Form appearanceOptionsForm = new Form();
		appearanceOptionsForm.setType(FormType.HORIZONTAL);
		
		final TextBox textColorTextBox = new TextBox();
		FormFieldSet textColorFieldSet = new FormFieldSet("Text color", textColorTextBox);
		textColorTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setColorXaxis(textColorTextBox.getText());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		
		final TextBox fontSizeTextBox = new TextBox();
		fontSizeTextBox.getElement().setAttribute("type", "number");
		fontSizeTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setSizeXaxis(fontSizeTextBox.getText());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		
		FormFieldSet fontSizeFieldSet = new FormFieldSet("Font size", fontSizeTextBox);
		
		
		appearanceOptionsForm.add(textColorFieldSet);
		appearanceOptionsForm.add(fontSizeFieldSet);
		
		
		final AccordionGroup appearanceOptionsGroupPanel = new AccordionGroup();
        appearanceOptionsGroupPanel.addStyleName("accordionPanel");
        appearanceOptionsGroupPanel.setHeading("X-AXIS");
        appearanceOptionsGroupPanel.getHeading().addStyleName("accordionHeading");
        appearanceOptionsGroupPanel.add(appearanceOptionsForm);
        appearanceOptionsGroupPanel.setIcon(IconType.PLUS);
        appearanceOptionsGroupPanel.setDefaultOpen(false);
        appearanceOptionsGroupPanel.addShowHandler(new ShowHandler() {
            @Override
            public void onShow(ShowEvent showEvent) {
                appearanceOptionsGroupPanel.setIcon(IconType.MINUS);
            }
        });
        appearanceOptionsGroupPanel.addHideHandler(new HideHandler() {
            @Override
            public void onHide(HideEvent hideEvent) {
                appearanceOptionsGroupPanel.setIcon(IconType.PLUS);
            }
        });
		
        
        flowPanel.add(appearanceOptionsGroupPanel);
	}
	
	public void designAppearanceForYaxis(){
		Form appearanceOptionsForm = new Form();
		appearanceOptionsForm.setType(FormType.HORIZONTAL);
		
		final TextBox textColorTextBox = new TextBox();
		FormFieldSet textColorFieldSet = new FormFieldSet("Text color", textColorTextBox);
		textColorTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setColorYaxis(textColorTextBox.getText());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		
		final TextBox fontSizeTextBox = new TextBox();
		fontSizeTextBox.getElement().setAttribute("type", "number");
		fontSizeTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setSizeYaxis(fontSizeTextBox.getText());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		
		FormFieldSet fontSizeFieldSet = new FormFieldSet("Font size", fontSizeTextBox);
		
		
		
		appearanceOptionsForm.add(textColorFieldSet);
		appearanceOptionsForm.add(fontSizeFieldSet);
		
		final AccordionGroup appearanceOptionsGroupPanel = new AccordionGroup();
        appearanceOptionsGroupPanel.addStyleName("accordionPanel");
        appearanceOptionsGroupPanel.setHeading("Y-AXIS");
        appearanceOptionsGroupPanel.getHeading().addStyleName("accordionHeading");
        appearanceOptionsGroupPanel.add(appearanceOptionsForm);
        appearanceOptionsGroupPanel.setIcon(IconType.PLUS);
        appearanceOptionsGroupPanel.setDefaultOpen(false);
        appearanceOptionsGroupPanel.addShowHandler(new ShowHandler() {
            @Override
            public void onShow(ShowEvent showEvent) {
                appearanceOptionsGroupPanel.setIcon(IconType.MINUS);
            }
        });
        appearanceOptionsGroupPanel.addHideHandler(new HideHandler() {
            @Override
            public void onHide(HideEvent hideEvent) {
                appearanceOptionsGroupPanel.setIcon(IconType.PLUS);
            }
        });
		
        
        flowPanel.add(appearanceOptionsGroupPanel);
	}
	
	
	@Override
	public Widget asWidget() {
		// TODO Auto-generated method stub
		return flowPanel;
	}

}
