package de.swm.mobile.kitchensink.client.showcase.animations;

import com.google.gwt.core.client.GWT;
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.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget;
import de.swm.commons.mobile.client.event.SelectionChangedEvent;
import de.swm.commons.mobile.client.widgets.DecoratedListItem;
import de.swm.commons.mobile.client.widgets.HeaderPanel;
import de.swm.commons.mobile.client.widgets.ListItem;
import de.swm.commons.mobile.client.widgets.PagingListPanel;
import de.swm.commons.mobile.client.widgets.PagingListPanel.ListItemProvider;
import de.swm.mobile.kitchensink.client.base.ShowcaseDetailPage;
import de.swm.mobile.kitchensink.client.theme.TestResources;

import java.util.ArrayList;
import java.util.List;

import static de.swm.mobile.kitchensink.client.ShowcaseAnnotations.ShowcaseSource;
import static de.swm.mobile.kitchensink.client.ShowcaseAnnotations.ShowcaseUiXML;

@ShowcaseSource
@ShowcaseUiXML({"LoadPage.ui.xml"})
public class LoadPage extends ShowcaseDetailPage {

    @UiField
    PagingListPanel list;

    @UiField
	HeaderPanel header;

    private static LoadPageUiBinder uiBinder = GWT.create(LoadPageUiBinder.class);


    interface LoadPageUiBinder extends UiBinder<Widget, LoadPage> {
    }

    private final TestResources resources;


    public LoadPage() {
        super(LoadPage.class);
        initWidget(uiBinder.createAndBindUi(this));
        resources = GWT.create(TestResources.class);
        list.setShowLoadingIndicator(true);
        list.setPageSize(5);
        list.setProvider(new ListItemProvider() {

            @Override
            public void provideItems(final int startIndex, final int numEntries, final AsyncCallback<List<ListItem>> callback) {
                Timer t = new Timer() {

                    @Override
                    public void run() {
                        List<ListItem> result = new ArrayList<ListItem>();
                        for (int i = 0; i < numEntries; i++) {
                            DecoratedListItem item = new DecoratedListItem(resources.info(), "Test Entry " + (startIndex + i), "Sub Label " + (startIndex + i));
                            result.add(item);
                        }
                        callback.onSuccess(result);
                    }

                };
                if (startIndex == 0) {
                    t.schedule(10);
                } else {
                    t.schedule(2000);
                }
            }
        });
    }


    @UiHandler("list")
    void onListSelectionChanged(SelectionChangedEvent e) {
        switch (e.getSelection()) {
            case 0:
                break;
            case 1:
                break;
        }
    }

    @Override
    public String getName() {
        return "Async loading";
    }

    @Override
    public HeaderPanel getHeaderPanel() {
        return header;
    }
}