package eu.dnetlib.client.leftColumn;

import java.util.ArrayList;

import com.github.gwtbootstrap.client.ui.AccordionGroup;
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.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.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
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.DeleteListener;
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 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 final ArrayList<DataserieWidget> overallList = new ArrayList<DataserieWidget>();
	private AppearancePanel apperancePanel = new AppearancePanel();
	
	public interface AddingDataseriesListener{
		public void onEvent(int numberOfColumn);
	}

	public OptionsWidget(SchemaAnswer schemaFromServer,int optionSelected,boolean isFromLoad){
		
		this.schemaFromServer = schemaFromServer;
		this.optionSelected = optionSelected;
		this.isFromLoad = isFromLoad;
		
		ValuesOfFields.getInstance().setOptionSelected(optionSelected);
		
		
		designAppearanceTab();
		designGeneralTab();
		designMainTabPanel();
		if(!isFromLoad)
			loadPresets();
	}
	
	public void designMainTabPanel(){
		
		mainTabPanel.setTabPosition("left");
		
		
		appearanceTab.setHeading("Appearance");
		dataSeriesTab.setHeading("Dataseries");
        dataSeriesTab.asWidget().addStyleName("folderTab");

		Image addDataserie = new Image("https://live.amcharts.com/static/img/icons/circle_plus.png");
		addDataserie.addStyleName("add-serie-icon");
		
		dataSeriesTab.addDecorate(addDataserie);
		
		
		addDataserie.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent arg0) {
				
					arg0.preventDefault();
					
					DataserieWidget temp = new DataserieWidget(mainTabPanel,schemaFromServer,totalColumns,specialColumnCounter,deleteImageList,listBoxes,false,dataSeriesTab,false,apperancePanel);
					overallList.add(temp);
				
					apperancePanel.addAppearanceForDataserie(totalColumns);
					
					DeleteListener deleteListener = new DeleteListener() {
						
						@Override
						public void onEvent(int numberOfDeletedColumn) {
							overallList.remove(numberOfDeletedColumn);
							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++;
					Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
				}
		});
		
		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(appearanceTab);
		mainTabPanel.add(generalTab);
		mainTabPanel.add(dataSeriesTab);
		
		if(isFromLoad){
			totalColumns=0;
			specialColumnCounter=0;
			for(int i=0;i<ValuesOfFields.getInstance().getColumnsDataList().size();i++){
				
				DataserieWidget temp = new DataserieWidget(mainTabPanel,schemaFromServer,totalColumns,specialColumnCounter,deleteImageList,listBoxes,true,dataSeriesTab,false,apperancePanel);
				overallList.add(temp);

				apperancePanel.addAppearanceForDataserie(totalColumns);

				DeleteListener deleteListener = new DeleteListener() {
					
					@Override
					public void onEvent(int numberOfDeletedColumn) {
						overallList.remove(numberOfDeletedColumn);
						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++;
				
			}
			Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),1);
		}
		mainTabPanel.addStyleName("main-navigation-bar");
		
		
		RootPanel.get("optionsColumn").add(mainTabPanel);
		
	}
	
	public void designAppearanceTab(){
		appearanceTab.add(apperancePanel.asWidget());
	}
	
	public void designGeneralTab(){
		
		FlowPanel masterPanel = new FlowPanel();

        Form generalOptionsForm = new Form();
        generalOptionsForm.setType(FormType.HORIZONTAL);

        final TextBox numberOfResults = new TextBox();
        numberOfResults.getElement().setAttribute("type", "number");
        numberOfResults.setText("30");
        numberOfResults.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				if(Integer.parseInt(numberOfResults.getText())>0)
					ValuesOfFields.getInstance().setNumberOfResults(Integer.parseInt(numberOfResults.getText()));
				else
					ValuesOfFields.getInstance().setNumberOfResults(30);
				
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
       

        generalOptionsForm.add(new FormFieldSet("Number of datasets", numberOfResults));
        
        
        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);
			}
		});
        
        
        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);
			}
		});

        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);
			}
		});


        final AccordionGroup generalOptionsGroupPanel = new AccordionGroup();
        generalOptionsGroupPanel.addStyleName("accordionPanel");
        generalOptionsGroupPanel.setHeading("GENERAL OPTIONS");
        generalOptionsGroupPanel.getHeading().addStyleName("accordionHeading");
        generalOptionsGroupPanel.add(generalOptionsForm);
        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);



        Form headersForm = new Form();
        headersForm.setType(FormType.HORIZONTAL);

        final TextBox titleTextBox = new TextBox();
        titleTextBox.addChangeHandler(new ChangeHandler() {

            @Override
            public void onChange(ChangeEvent arg0) {
                // TODO Auto-generated method stub
            	ValuesOfFields.getInstance().setTitle(titleTextBox.getText().replaceAll("\"", "\\\\\""));
                Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
            }
        });
        headersForm.add(new FormFieldSet("Chart title", titleTextBox));

        final TextBox subtitleTextBox = new TextBox();
        subtitleTextBox.addChangeHandler(new ChangeHandler() {

            @Override
            public void onChange(ChangeEvent arg0) {
            	ValuesOfFields.getInstance().setSubtitle(subtitleTextBox.getText().replaceAll("\"", "\\\\\""));
            	Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
            }
        });
        headersForm.add(new FormFieldSet("Chart subtitle", subtitleTextBox));

        final TextBox xaxisTextBox = new TextBox();
        xaxisTextBox.addChangeHandler(new ChangeHandler() {

            @Override
            public void onChange(ChangeEvent arg0) {
                // TODO Auto-generated method stub
            	ValuesOfFields.getInstance().setXaxis(xaxisTextBox.getText().replaceAll("\"", "\\\\\""));
            	Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
            }
        });
        headersForm.add(new FormFieldSet("Naming x-axis", xaxisTextBox));

        final TextBox yaxisTextBox = new TextBox();
        yaxisTextBox.addChangeHandler(new ChangeHandler() {

            @Override
            public void onChange(ChangeEvent arg0) {
                // TODO Auto-generated method stub
            	ValuesOfFields.getInstance().setYaxis(yaxisTextBox.getText().replaceAll("\"", "\\\\\""));
            	Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
            }
        });
        headersForm.add(new FormFieldSet("Naming y-axis", yaxisTextBox));

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

        masterPanel.add(titlesGroupPanel);

        
        if(isFromLoad){
        	if(!ValuesOfFields.getInstance().getTitle().isEmpty()){
        		titleTextBox.setText(ValuesOfFields.getInstance().getTitle());
        		titlesGroupPanel.show();
        	}
        	
        	if(!ValuesOfFields.getInstance().getXaxis().isEmpty()){
        		xaxisTextBox.setText(ValuesOfFields.getInstance().getXaxis());
        		titlesGroupPanel.show();
        	}
        	
        	if(!ValuesOfFields.getInstance().getYaxis().isEmpty()){
        		yaxisTextBox.setText(ValuesOfFields.getInstance().getYaxis());
        		titlesGroupPanel.show();
        	}
        	
        	if(!ValuesOfFields.getInstance().getSubtitle().isEmpty()){
        		subtitleTextBox.setText(ValuesOfFields.getInstance().getSubtitle());
        		titlesGroupPanel.show();
        	}
        }
        
		generalTab.add(masterPanel);
				
	}

	public void loadPresets(){
		int size;
		if(optionSelected%10==3 || (optionSelected>=40 && optionSelected<50))
			size=1;
		else
			size=2;
		
		for(int i=0;i<size;i++){
			DataserieWidget temp = new DataserieWidget(mainTabPanel,schemaFromServer,totalColumns,specialColumnCounter,deleteImageList,listBoxes,false,dataSeriesTab,true,apperancePanel);
			overallList.add(temp);
			apperancePanel.addAppearanceForDataserie(totalColumns);
			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(0);
		appearanceTab.setActive(true);
		appearanceTab.setEnabled(true);
	}
	
	public void SwitchTabs(Tab previous, Tab next){
			
		next.setEnabled(true);
		next.setActive(true);

	}
}
