package eu.dnetlib.client.widgets;

import java.util.Date;

import com.github.gwtbootstrap.client.ui.Button;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.TimeZone;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.datepicker.client.CalendarUtil;

import eu.dnetlib.client.widgets.slider.RangeSlider;
import eu.dnetlib.client.widgets.slider.SliderEvent;
import eu.dnetlib.client.widgets.slider.SliderListener;


public class DataRangeSlider implements IsWidget {

    private FlowPanel flowPanel = new FlowPanel();

    private Button applyButton = new Button("Apply");

    private HTML currentDatesLabel = new HTML();
    private RangeSlider rangeSlider;
    private Label minValueLabel = new Label();
    private Label maxValueLabel = new Label();

    private DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy/MM/dd");
    private TimeZone tz = TimeZone.createTimeZone(0);

    private Date minDate;
    private Date maxDate;

    private Date defaultMin;
    private Date defaultMax;

    public DataRangeSlider(Date minDate, Date maxDate, Date defaultMin, Date defaultMax) {
    	
        this.minDate = minDate;
        this.maxDate = maxDate;

        int totalDays = CalendarUtil.getDaysBetween(minDate, maxDate);

        if(defaultMin.before(minDate))
            defaultMin = CalendarUtil.copyDate(minDate);
        if(defaultMin.after(maxDate))
            defaultMin = CalendarUtil.copyDate(maxDate);
        int daysOfMinRange = CalendarUtil.getDaysBetween(minDate, defaultMin);

        if(defaultMax.before(minDate))
            defaultMax = CalendarUtil.copyDate(minDate);
        if(defaultMax.after(maxDate))
            defaultMax = CalendarUtil.copyDate(maxDate);
        int daysOfMaxRange = CalendarUtil.getDaysBetween(minDate, defaultMax);
        
        rangeSlider = new RangeSlider("dateRangeSlider", 0, totalDays, daysOfMinRange, daysOfMaxRange);
        rangeSlider.addListener(new DateRangeSliderListener());

        currentDatesLabel.setHTML("Selected Dates <br> [" + dtf.format(defaultMin, tz) + " - " + dtf.format(defaultMax, tz) + "]");
        currentDatesLabel.addStyleName("dateRangeSliderCurrentDates");

        minValueLabel.setText(dtf.format(minDate, tz));
        minValueLabel.addStyleName("dateRangeSliderMinDate");

        maxValueLabel.setText(dtf.format(maxDate, tz));
        maxValueLabel.addStyleName("dateRangeSliderMaxDate");

        applyButton.addStyleName("applyDateRangeButton");
        applyButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {

             
            }
        });
        
        flowPanel.add(applyButton);
        flowPanel.add(currentDatesLabel);
        flowPanel.add(rangeSlider);
        flowPanel.add(maxValueLabel);
        flowPanel.add(minValueLabel);
       
        flowPanel.addStyleName("dateRangeWidget");
    }

    @Override
    public Widget asWidget() {
        return flowPanel;
    }


    public class DateRangeSliderListener implements SliderListener {

        @Override
        public void onStart(SliderEvent e) {

        }

        @Override
        public boolean onSlide(SliderEvent e) {
            defaultMin = CalendarUtil.copyDate(minDate);
            CalendarUtil.addDaysToDate(defaultMin, e.getValues()[0]);
            
            defaultMax = CalendarUtil.copyDate(minDate);
            CalendarUtil.addDaysToDate(defaultMax, e.getValues()[1]);
            
            currentDatesLabel.setHTML("Selected Dates <br> [" + dtf.format(defaultMin, tz) + " - " + dtf.format(defaultMax, tz) + "]");
            return true;
        }

        @Override
        public void onChange(SliderEvent e) {

        }

        @Override
        public void onStop(SliderEvent e) {

        }
    }
}