package eu.dnetlib.client.leftColumn;

import java.util.ArrayList;

import com.github.gwtbootstrap.client.ui.AccordionGroup;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.CheckBox;
import com.github.gwtbootstrap.client.ui.Form;
import com.github.gwtbootstrap.client.ui.Image;
import com.github.gwtbootstrap.client.ui.Tab;
import com.github.gwtbootstrap.client.ui.TabPanel;
import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
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.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;

import eu.dnetlib.client.Generate;
import eu.dnetlib.client.leftColumn.DataserieWidget.ChangedType;
import eu.dnetlib.client.leftColumn.DataserieWidget.DeleteListener;
import eu.dnetlib.client.leftColumn.DataserieWidget.DuplicateListener;
import eu.dnetlib.client.widgets.DropdownListWidget;
import eu.dnetlib.client.widgets.FormFieldSet;
import eu.dnetlib.shared.SchemaAnswer;
import eu.dnetlib.shared.ValuesOfFields;

public class OptionsWidget extends Widget {

	private TabPanel mainTabPanel = new TabPanel();
	private Tab appearanceTab = new Tab();
	private Tab dataSeriesTab = new Tab();
	private Tab generalTab = new Tab();
	private Tab titlesTab = new Tab();
	private Tab mapsTab = new Tab();
	private int totalColumns=0;
	private int specialColumnCounter=0;
	private SchemaAnswer schemaFromServer;
	private int optionSelected=0;
	private ArrayList<Image> deleteImageList = new ArrayList<Image>();
	private ArrayList<DropdownListWidget> listBoxes = new ArrayList<DropdownListWidget>();
	private boolean isFromLoad;
	private ArrayList<DataserieWidget> overallList = new ArrayList<DataserieWidget>();
	private AppearancePanel apperancePanel;
	
	private ArrayList<FiltersPanel> filtersPanels = new ArrayList<FiltersPanel>();
	private final Button applyChangesGeneral = new Button();
	private final Button applyChangesTitles = new Button();
	private TitlesPanel titlesPanel;
	
	
	private FlowPanel loader_big = new FlowPanel();
	private FlowPanel whiteFilm = new FlowPanel();
	
	
	
	private final Image addDataserie = new Image("https://live.amcharts.com/static/img/icons/circle_plus.png");
	
	public interface AddingDataseriesListener{
		public void onEvent(int numberOfColumn);
	}

	public OptionsWidget(SchemaAnswer schemaFromServer,int optionSelected,boolean isFromLoad){
		
		
		loader_big.setStyleName("loader-big");
		whiteFilm.setStyleName("whiteFilm");
		
		this.schemaFromServer = schemaFromServer;
		this.optionSelected = optionSelected;
		this.isFromLoad = isFromLoad;
		apperancePanel  = new AppearancePanel(isFromLoad);
		ValuesOfFields.getInstance().setOptionSelected(optionSelected);
		
		designTitlesTab();
		designGeneralTab();
		designAppearanceTab();
		designMapOptions();
		
		if(optionSelected==60){
			mapsTab.asWidget().setVisible(true);
		}else{
			mapsTab.asWidget().setVisible(false);
		}
		
		designMainTabPanel(false);


	}
	
	public void designMapOptions(){
		MapOptionsPanel mapOptionsPanel = new MapOptionsPanel(isFromLoad);
		mapsTab.add(mapOptionsPanel.asWidget());
	}
	
	public void designMainTabPanel(boolean isDuplicate){
		
		mainTabPanel.clear();
		
		
		if(isDuplicate){
			deleteImageList = new ArrayList<Image>();
			overallList = new ArrayList<DataserieWidget>();
			dataSeriesTab = new Tab();
			dataSeriesTab.addDecorate(addDataserie);
		}
		
		mainTabPanel.setTabPosition("left");
		
		appearanceTab.setHeading("Appearance");
		dataSeriesTab.setHeading("Add dataseries");
		mapsTab.setHeading("Map options");
        dataSeriesTab.asWidget().addStyleName("folderTab");
        
        
        
        if(!isDuplicate){
			addDataserie.addStyleName("add-serie-icon");
			dataSeriesTab.addDecorate(addDataserie);
        }
        
		if(!isFromLoad)
			addDataserie.addStyleName("flashing-button");
		
		dataSeriesTab.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				
				event.preventDefault();
				addDataserie.removeStyleName("flashing-button");
				DataserieWidget temp = new DataserieWidget(mainTabPanel,schemaFromServer,totalColumns,specialColumnCounter,deleteImageList,listBoxes,false,dataSeriesTab,true,apperancePanel,optionSelected,filtersPanels);
				overallList.add(temp);
				
				mainTabPanel.clear();
				
				mainTabPanel.add(dataSeriesTab);
				for(int i=0;i<overallList.size();i++){
					mainTabPanel.add(overallList.get(i).getSingleColumn());
					if(i==overallList.size()-1){
						appearanceTab.setActive(false);
						generalTab.setActive(false);
						titlesTab.setActive(false);
						if(optionSelected==60)
							mapsTab.setActive(false);
						mainTabPanel.selectTab(1+i);
						overallList.get(i).getRenameTextBox().setFocus(true);
					}
				}
				mainTabPanel.add(titlesTab);
				mainTabPanel.add(generalTab);
				mainTabPanel.add(appearanceTab);
//				if(optionSelected==60)
					mainTabPanel.add(mapsTab);
			
				ChangedType changeTypeListener = new ChangedType() {
					
					@Override
					public void onEvent(int chartType) {
						// TODO Auto-generated method stub
						mapsTab.asWidget().setVisible(false);
						if(chartType==1){
							mapsTab.asWidget().setVisible(true);
						}else if(chartType==2){
							titlesPanel.titlesForBar();
						}else if(chartType==3){
							titlesPanel.titlesForColumn();
						}else{
							titlesPanel.titlesForColumn();
						}
					}
				};
				overallList.get(specialColumnCounter).setChangedTypeListener(changeTypeListener);
				
				apperancePanel.addAppearanceForDataserie(totalColumns);
				
				DuplicateListener duplicateListener = new DuplicateListener() {
					
					@Override public void onEvent(int duplicatedDataseries) {
						// TODO Auto-generated method stub

						isFromLoad=true;

						ValuesOfFields.getInstance().getColumnsDataList().add(ValuesOfFields.getInstance().getColumnsDataList().get(duplicatedDataseries));

						designMainTabPanel(true);
					}
				};
				
				overallList.get(specialColumnCounter).setDuplicateListener(duplicateListener);
				
				DeleteListener deleteListener = new DeleteListener() {
					
					@Override
					public void onEvent(int numberOfDeletedColumn) {
						overallList.remove(numberOfDeletedColumn);
						mainTabPanel.clear();
						mainTabPanel.add(dataSeriesTab);
						for(int i=0;i<overallList.size();i++){
							mainTabPanel.add(overallList.get(i).getSingleColumn());
							if(i==overallList.size()-1){
								mainTabPanel.selectTab(1+i);
							}
						}
						mainTabPanel.add(titlesTab);
						mainTabPanel.add(generalTab);
						mainTabPanel.add(appearanceTab);
//						if(optionSelected==60)
							mainTabPanel.add(mapsTab);
						
						apperancePanel.deleteAppearanceOfDataseries(numberOfDeletedColumn);
						for(int i=numberOfDeletedColumn;i<overallList.size();i++){
							overallList.get(i).setNumberOfCurrentColumn(overallList.get(i).getNumberOfCurrentColumn()-1);
						}
						
						specialColumnCounter--;
					}
				};
				overallList.get(specialColumnCounter).setDeleteListener(deleteListener);
				totalColumns++;
				specialColumnCounter++;
			}
		});
		

		dataSeriesTab.asTabLink().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				event.preventDefault();

				dataSeriesTab.asTabLink().setActive(false);
				dataSeriesTab.setEnabled(false);
				dataSeriesTab.asTabLink().getElement().removeClassName("disabled");
			}
		});
		
		generalTab.setHeading("General options");
		
		mainTabPanel.add(dataSeriesTab);
		mainTabPanel.add(titlesTab);
		mainTabPanel.add(generalTab);
		mainTabPanel.add(appearanceTab);
		mainTabPanel.add(mapsTab);
		
		
		if(isFromLoad){
			totalColumns=0;
			specialColumnCounter=0;
			mainTabPanel.clear();
			mainTabPanel.add(dataSeriesTab);
			for(int i=0;i<ValuesOfFields.getInstance().getColumnsDataList().size();i++){
				
				specialColumnCounter = i;
				DataserieWidget temp = new DataserieWidget(mainTabPanel,schemaFromServer,totalColumns,specialColumnCounter,deleteImageList,listBoxes,true,dataSeriesTab,false,apperancePanel,optionSelected,filtersPanels);
				overallList.add(temp);
				apperancePanel.addAppearanceForDataserie(totalColumns);
				
				
				ChangedType changeTypeListener = new ChangedType() {
					
					@Override
					public void onEvent(int chartType) {
						// TODO Auto-generated method stub
						mapsTab.asWidget().setVisible(false);
						if(chartType==1){
							mapsTab.asWidget().setVisible(true);
						}else if(chartType==2){
							titlesPanel.titlesForBar();
						}else if(chartType==3){
							titlesPanel.titlesForColumn();
						}else{
							titlesPanel.titlesForColumn();
						}
					}
				};
				
				overallList.get(specialColumnCounter).setChangedTypeListener(changeTypeListener);
				
				DeleteListener deleteListener = new DeleteListener() {
					
					@Override
					public void onEvent(int numberOfDeletedColumn) {
						overallList.remove(numberOfDeletedColumn);
						mainTabPanel.clear();
						mainTabPanel.add(dataSeriesTab);
						for(int i=0;i<overallList.size();i++){
							mainTabPanel.add(overallList.get(i).getSingleColumn());
							if(i==overallList.size()-1){
								mainTabPanel.selectTab(1+i);
							}
						}
						mainTabPanel.add(titlesTab);
						mainTabPanel.add(generalTab);
						mainTabPanel.add(appearanceTab);
//						if(optionSelected==60)
							mainTabPanel.add(mapsTab);
							
						
						apperancePanel.deleteAppearanceOfDataseries(numberOfDeletedColumn);
						for(int i=numberOfDeletedColumn;i<overallList.size();i++){
							overallList.get(i).setNumberOfCurrentColumn(overallList.get(i).getNumberOfCurrentColumn()-1);
						}
						specialColumnCounter--;
					}
				};
				
				overallList.get(specialColumnCounter).setDeleteListener(deleteListener);
				
				
				
				
				DuplicateListener duplicateListener = new DuplicateListener() {
					
					@Override public void onEvent(int duplicatedDataseries) {
						// TODO Auto-generated method stub
						
						isFromLoad=true;

						ValuesOfFields.getInstance().getColumnsDataList().add(ValuesOfFields.getInstance().getColumnsDataList().get(duplicatedDataseries));

						designMainTabPanel(true);
					}
				};
				
				overallList.get(specialColumnCounter).setDuplicateListener(duplicateListener);
				
				
				
				
				totalColumns++;
				specialColumnCounter++;
				mainTabPanel.add(temp.getSingleColumn());
				temp.getSingleColumn().setHeading(ValuesOfFields.getInstance().getColumnsDataList().get(i).getDataserieNaming());
			}
			mainTabPanel.add(titlesTab);
			mainTabPanel.add(generalTab);
			mainTabPanel.add(appearanceTab);
//			if(optionSelected==60)
				mainTabPanel.add(mapsTab);
			
			Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),1);
			isFromLoad=false;
			mainTabPanel.selectTab(ValuesOfFields.getInstance().getColumnsDataList().size());
		}
		
		mainTabPanel.addStyleName("main-navigation-bar");
		
		
		RootPanel.get("optionsColumn").add(mainTabPanel);
		
	}
	
	public void designAppearanceTab(){
		
		appearanceTab.add(apperancePanel.asWidget());
		appearanceTab.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				initColorPicker();
			}
		});
	}
	
	 public static native void initColorPicker() /*-{
	   $wnd.$(".basic").change(function(){});
	    
	    var element = $wnd.$(".basic");
	    element.spectrum({
	    		showInput: true,
	    		showAlpha: true,
	    		preferredFormat: "rgb",
	    		change:function(color){
		    		$wnd.$(this).attr("value",color.toRgbString());
		    	}
		    });
	 }-*/;
	 
	public void designTitlesTab(){
	    titlesPanel = new TitlesPanel(isFromLoad,titlesTab,optionSelected);
		titlesTab.setHeading("Titles");
		titlesTab.add(titlesPanel.asWidget());
	}
	
	public void designGeneralTab(){
		
		FlowPanel masterPanel = new FlowPanel();
		
		
		applyChangesGeneral.setText("Apply");
		applyChangesGeneral.addStyleName("applychanges");
		applyChangesGeneral.setType(ButtonType.PRIMARY);
		applyChangesGeneral.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				applyChangesGeneral.setEnabled(false);
				applyChangesGeneral.removeStyleName("flashing-button-apply");
				Generate.getInstance().getTheme1().addLoadHandler(new LoadHandler() {
					
					@Override
					public void onLoad(LoadEvent event) {
						applyChangesGeneral.setEnabled(true);
					}
				});
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),1);
			}
		});
		
		
		applyChangesTitles.setText("Apply");
		applyChangesTitles.addStyleName("applychanges");
		applyChangesTitles.setType(ButtonType.PRIMARY);
		applyChangesTitles.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				applyChangesTitles.setEnabled(false);
				applyChangesTitles.removeStyleName("flashing-button-apply");
				Generate.getInstance().getTheme1().addLoadHandler(new LoadHandler() {
					
					@Override
					public void onLoad(LoadEvent event) {
						applyChangesTitles.setEnabled(true);
					}
				});
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),1);
			}
		});
		
		
		Form generalOptionsForm = new Form();

        
        
        final CheckBox cumulativeCheckbox = new CheckBox();
        generalOptionsForm.add(new FormFieldSet("Cumulative chart", cumulativeCheckbox));
        cumulativeCheckbox.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				if(cumulativeCheckbox.isChecked()){
					ValuesOfFields.getInstance().setCumulative(true);
				}else{
					ValuesOfFields.getInstance().setCumulative(false);
				}
//				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
				applyChangesGeneral.addStyleName("flashing-button-apply");
			}
		});
        
      
        final TextBox rotateTextBox = new TextBox();
        rotateTextBox.setPlaceholder("Degrees..");
        generalOptionsForm.add(new FormFieldSet("Rotation of labels", rotateTextBox));
        rotateTextBox.getElement().setAttribute("type", "number");
        rotateTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setRotation(Integer.parseInt(rotateTextBox.getText()));
//				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);

				applyChangesGeneral.addStyleName("flashing-button-apply");
			}
		});

        final TextBox useStepsTextBox = new TextBox();
        useStepsTextBox.getElement().setAttribute("type", "number");
        generalOptionsForm.add(new FormFieldSet("Use steps", useStepsTextBox));
        useStepsTextBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				ValuesOfFields.getInstance().setUseSteps(Integer.parseInt(useStepsTextBox.getText()));
//				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
				applyChangesGeneral.addStyleName("flashing-button-apply");
			}
		});


        
        final AccordionGroup generalOptionsGroupPanel = new AccordionGroup();
        generalOptionsGroupPanel.addStyleName("accordionPanel");
        generalOptionsGroupPanel.setHeading("GENERAL OPTIONS");
        generalOptionsGroupPanel.getHeading().addStyleName("accordionHeading");
        generalOptionsGroupPanel.add(generalOptionsForm);
        generalOptionsGroupPanel.add(applyChangesGeneral);
        generalOptionsGroupPanel.setIcon(IconType.MINUS);
        generalOptionsGroupPanel.setDefaultOpen(true);
        generalOptionsGroupPanel.addShowHandler(new ShowHandler() {
            @Override
            public void onShow(ShowEvent showEvent) {
                generalOptionsGroupPanel.setIcon(IconType.MINUS);
            }
        });
        generalOptionsGroupPanel.addHideHandler(new HideHandler() {
            @Override
            public void onHide(HideEvent hideEvent) {
                generalOptionsGroupPanel.setIcon(IconType.PLUS);
            }
        });

		masterPanel.add(generalOptionsGroupPanel);

		generalTab.add(masterPanel);
				
	}

	public void loadPresets(){
		int size;
		
		if(optionSelected%10==3 || (optionSelected>=50))
			size=1;
		else
			size=2;
		
		for(int i=0;i<1;i++){
			DataserieWidget temp = new DataserieWidget(mainTabPanel,schemaFromServer,totalColumns,specialColumnCounter,deleteImageList,listBoxes,false,dataSeriesTab,true,apperancePanel,optionSelected,filtersPanels);

			overallList.add(temp);
			apperancePanel.addAppearanceForDataserie(totalColumns);
			
			ChangedType changeTypeListener = new ChangedType() {
				
				@Override
				public void onEvent(int chartType) {
					// TODO Auto-generated method stub
					mapsTab.asWidget().setVisible(false);
					if(chartType==1){
						mapsTab.asWidget().setVisible(true);
					}else if(chartType==2){
						titlesPanel.titlesForBar();
					}else if(chartType==3){
						titlesPanel.titlesForColumn();
					}else{
						titlesPanel.titlesForColumn();
					}
				}
			};

			overallList.get(specialColumnCounter).setChangedTypeListener(changeTypeListener);
			
			DeleteListener deleteListener = new DeleteListener() {
				
				@Override
				public void onEvent(int numberOfDeletedColumn) {
					apperancePanel.deleteAppearanceOfDataseries(numberOfDeletedColumn);
					for(int i=numberOfDeletedColumn;i<overallList.size();i++){
						overallList.get(i).setNumberOfCurrentColumn(overallList.get(i).getNumberOfCurrentColumn()-1);
					}
					overallList.remove(numberOfDeletedColumn);
					specialColumnCounter--;
				}
			};
			
			overallList.get(specialColumnCounter).setDeleteListener(deleteListener);
			totalColumns++;
			specialColumnCounter++;
			Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
		}
		mainTabPanel.selectTab(1+ValuesOfFields.getInstance().getColumnsDataList().size());
		appearanceTab.setActive(true);
		appearanceTab.setEnabled(true);
	}
	
	public void SwitchTabs(Tab previous, Tab next){
			
		next.setEnabled(true);
		next.setActive(true);

	}
}
