package eu.dnetlib.client.header;

import java.text.SimpleDateFormat;
import java.util.Date;

import com.github.gwtbootstrap.client.ui.Brand;
import com.github.gwtbootstrap.client.ui.Form;
import com.github.gwtbootstrap.client.ui.Form.SubmitCompleteHandler;
import com.github.gwtbootstrap.client.ui.Modal;
import com.github.gwtbootstrap.client.ui.Nav;
import com.github.gwtbootstrap.client.ui.NavLink;
import com.github.gwtbootstrap.client.ui.Navbar;
import com.github.gwtbootstrap.client.ui.constants.IconType;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.NativeEvent;
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.DomEvent;
import com.google.gwt.http.client.URL;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;

import eu.dnetlib.client.header.NewFeatureWidget.HideListener;
import eu.dnetlib.client.header.SaveWidget.SaveListener;
import eu.dnetlib.client.leftColumn.OptionsWidget;
import eu.dnetlib.client.rightColumn.DataBox;
import eu.dnetlib.client.rightColumn.PreviewBox;
import eu.dnetlib.shared.SchemaAnswer;
import eu.dnetlib.shared.ValuesOfFields;

public class SiteHeader extends Widget{

	
	/*******Navigation header******/
	private Nav headerNav = new Nav();
	private Navbar headerNavBar = new Navbar();
	
	/***********Navigation Links of header bar**********/
	private NavLink saveButton = new NavLink();
	private NavLink loadButton = new NavLink();
	private NavLink newButton = new NavLink();
	private NavLink PublishButton = new NavLink();
	private SchemaAnswer schemaFromServer;
	private SavingInfoServiceAsync savingInfo = GWT.create(SavingInfoService.class);
	
	
	public SiteHeader(SchemaAnswer schemaFromServer){
		
		this.schemaFromServer = schemaFromServer;
		designHeaderBar();
	}
	
	public void designHeaderBar(){
		
		saveButton.addStyleName("header-buttons");
		saveButton.setText("Save");
		saveButton.setIcon(IconType.SAVE);
		saveButton.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				final Modal tempModal = new Modal();	
				final Date tempDate = new Date();
				final DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat("dd-MM-yyyy");
				savingInfo.save(ValuesOfFields.getInstance(), Window.Location.getPath()+""+dateTimeFormat.format(tempDate)+".xml"/*dateTimeFormat.format(tempDate)*/, new AsyncCallback<Boolean>() {
					
					@Override
					public void onSuccess(Boolean result) {
						Window.Location.replace(URL.encode(Window.Location.getPath()+"/DownloadFile?filename="+Window.Location.getPath()+""+dateTimeFormat.format(tempDate)+".xml"));
					}
					
					@Override
					public void onFailure(Throwable caught) {
						Window.alert("Unexpected error!");
					}
				});
			}
		});
		
		
		final Form form = new Form();
	    form.setAction(Window.Location.getPath()+"FileUpload");
	  
	    form.setVisible(false);
	    form.setEncoding(FormPanel.ENCODING_MULTIPART);
	    form.setMethod(FormPanel.METHOD_POST);
	    
		final FileUpload fileUpload = new FileUpload();
		fileUpload.setName("uploadFileName");
		fileUpload.getElement().setAttribute("accept", ".xml");
		
		fileUpload.setVisible(false);
		
		form.add(fileUpload);
		form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
			
			@Override
			public void onSubmitComplete(
					com.github.gwtbootstrap.client.ui.Form.SubmitCompleteEvent event) {
					if(!event.getResults().equals("TypeFailure")){
						savingInfo.load("/var/lib/tomcat7/webapps/"+Window.Location.getPath()+event.getResults(), new AsyncCallback<ValuesOfFields>() {
							
							@Override
							public void onSuccess(ValuesOfFields result) {
								ValuesOfFields.getInstance();
								ValuesOfFields.setInstance(result);
								RootPanel.get("optionsColumn").clear();
								new PreviewBox();
								new DataBox();
								new OptionsWidget(schemaFromServer, ValuesOfFields.getInstance().getOptionSelected(), true);
							}
							
							@Override
							public void onFailure(Throwable caught) {
								Window.alert("Corrupted file!");
							}
						});
					}else{
						Window.alert("Type must be .xml");
					}
			}
		});
		
		fileUpload.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				form.submit();
			}
		});
		
		loadButton.addStyleName("header-buttons");
		loadButton.setText("Load");
		loadButton.setIcon(IconType.FOLDER_OPEN);
		loadButton.add(form);
		loadButton.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
//				fileUpload.click();	
				LoadWidget loadWidget = new LoadWidget(schemaFromServer);
			}
		});
				
		newButton.addStyleName("header-buttons");
		newButton.setText("New");
		newButton.setIcon(IconType.REFRESH);
		newButton.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent arg0) {
				// TODO Auto-generated method stub
				final Modal tempModal = new Modal();
				NewFeatureWidget tempNewFeatureWidget = new NewFeatureWidget();
				
			}
		});

		PublishButton.addStyleName("header-buttons");
		PublishButton.setText("Publish");
		PublishButton.setIcon(IconType.ARROW_UP);
		PublishButton.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				final Modal tempModal = new Modal();
				PublishWidget tempPublishWidget = new PublishWidget();
				tempModal.add(tempPublishWidget.asWidget());
				
				tempModal.show();	
			}
		});
		
		Brand logo = new Brand("OpenAIRE statistics");
		logo.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				Window.Location.reload();
			}
		});
		
		
		headerNav.add(newButton);
		headerNav.add(saveButton);
		headerNav.add(loadButton);
		headerNav.add(PublishButton);
		headerNavBar.add(logo);
		headerNavBar.add(headerNav);
		headerNavBar.getElement().getStyle().setBackgroundImage("http://www.canadiancapitaladvance.com/images/background-header.jpg");
		
		RootPanel.get("block-header").add(headerNavBar);
		
	}
	
}
