package gwt.material.design.demo.client.application.components.pickers;

/*
 * #%L
 * GwtMaterial
 * %%
 * Copyright (C) 2015 - 2016 GwtMaterialDesign
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */


import com.google.gwt.core.client.JsDate;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Widget;
import com.gwtplatform.mvp.client.ViewImpl;
import gwt.material.design.client.constants.DatePickerLanguage;
import gwt.material.design.client.ui.MaterialDatePicker;
import gwt.material.design.client.ui.MaterialListBox;
import gwt.material.design.client.ui.MaterialToast;
import gwt.material.design.client.ui.html.Option;
import gwt.material.design.demo.client.application.dto.DataHelper;

import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class PickersView extends ViewImpl implements PickersPresenter.MyView {
    interface Binder extends UiBinder<Widget, PickersView> {
    }

    @UiField
    MaterialDatePicker dp, dpFormat, dpLimit, dpClear, dpEvents, dpTranslation, dpOpenClose, dpAutoClose, dpBirthdate, dpValue;

    @UiField
    MaterialListBox lstLanguage;

    private List<DatePickerLanguage> languages = new ArrayList<>();

    @Inject
    PickersView(Binder uiBinder) {
        initWidget(uiBinder.createAndBindUi(this));

        dpLimit.setDateMin(new Date(117, 0, 1));
        dpLimit.setDateMax(new Date(117, 0, 15));
        // Events on date picker
        dpEvents.addOpenHandler(event -> {
            if(event.getTarget().getValue() != null){
                MaterialToast.fireToast("Opened Date Picker " + event.getTarget().getValue());
            }else{
                MaterialToast.fireToast("Opened Date Picker" );
            }
        });
        dpEvents.addCloseHandler(event -> MaterialToast.fireToast("Closed Date Picker with value " + event.getTarget().getValue()));
        dpEvents.addValueChangeHandler(event -> MaterialToast.fireToast("Date Selected " + event.getValue()));

        dpOpenClose.addOpenHandler(event -> {
            if(event.getTarget().getValue() != null){
                MaterialToast.fireToast("Opened Date Picker " + event.getTarget().getValue());
            } else {
                MaterialToast.fireToast("Opened Date Picker" );
            }
        });
        dpOpenClose.addCloseHandler(event -> MaterialToast.fireToast("Closed Date Picker with value " + event.getTarget().getValue()));
        dpOpenClose.addValueChangeHandler(event -> {
            MaterialToast.fireToast("Date Selected " + event.getValue());
            dpOpenClose.close();
        });

        dpAutoClose.addValueChangeHandler(event -> {
            MaterialToast.fireToast("Date Selected " + event.getValue());
        });

        dpBirthdate.setDate(new Date(50, 1, 1));

        initLanguage();
    }

    private void initLanguage() {
        for(DatePickerLanguage lang : DataHelper.getAllDateLanguage()) {
            languages.add(lang);
            lstLanguage.add(new Option(lang.getName()));
        }
    }

    @UiHandler("lstLanguage")
    void onChange(ValueChangeEvent<String> event) {
        DatePickerLanguage lang = languages.get(lstLanguage.getSelectedIndex());
        dpTranslation.setLanguage(lang);
    }

    @UiHandler("btnSetDate")
    void onSetDate(ClickEvent e){
        dp.setDate(new Date(116, 0,1));
    }

    @UiHandler("btnGetDate")
    void onGetDate(ClickEvent e){
        MaterialToast.fireToast("" + dp.getDate());
    }

    @UiHandler("btnSetFormat")
    void onDpFormat(ClickEvent e){
        dpFormat.setDate(new Date());
    }

    @UiHandler("btnClear")
    void onDpClear(ClickEvent e) { dpClear.clear(); }

    @UiHandler("btnGetValue")
    void onDpGetValue(ClickEvent e) {
        MaterialToast.fireToast(dpClear.getValue() + "");
    }

    @UiHandler("btnOpen")
    void onOpen(ClickEvent e) {
        dpOpenClose.open();
    }

    @UiHandler("dpValue")
    void onDpValueChange(ValueChangeEvent<Date> e) {
        MaterialToast.fireToast(e.getValue() + "");
    }

    @UiHandler("btnDpValue")
    void onDpValue(ClickEvent e) {
        //dpValue.setValue(new Date());
        dpValue.setValue(new Date(), false);
        Long l = new Date().getTime();
        l = l - 2592000000L;      //1 Months in Milliseconds = 2592000000
        Date dd = new Date();
        dd.setTime(l);
        dpValue.setPickerDate(JsDate.create(dd.getTime()), dpValue.getDateInput().getElement());
    }

    @UiHandler("btnDpValueEvent")
    void onDpValueEvent(ClickEvent e) {
        Date date = new Date(123,1,1);
        dpValue.setValue(date, true);
    }
}