package org.vaadin.viritinv7;

import com.vaadin.annotations.Theme;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.beanutils.BeanComparator;
import org.vaadin.addonhelpers.AbstractTest;
import org.vaadin.viritin.LazyList;
import org.vaadin.viritinv7.SortableLazyList;
import org.vaadin.viritinv7.fields.MTable;
import org.vaadin.viritin.layouts.MVerticalLayout;
import org.vaadin.viritin.testdomain.Person;
import org.vaadin.viritin.testdomain.Service;

/**
 *
 * @author Matti Tahvonen
 */
@Theme("valo")
public class MTableLazyLoadingWithSorting extends AbstractTest {

    @Override
    public Component getTestComponent() {

        final List<Person> orig = Service.getListOfPersons(1000);

        MTable<Person> g = new MTable<>(
                new SortableLazyList.SortablePagingProvider<Person>() {
                    private static final long serialVersionUID = 5276735386651186011L;

                    @Override
            public List<Person> findEntities(int firstRow, boolean sortAscending,
                    String property) {
                List<Person> listOfPersons = new ArrayList<>(orig);
                if (property != null) {

                    Collections.sort(listOfPersons, new BeanComparator<>(
                            property));
                    if (!sortAscending) {
                        Collections.reverse(listOfPersons);
                    }
                }
                int last = firstRow + LazyList.DEFAULT_PAGE_SIZE;
                if (last > listOfPersons.size()) {
                    last = listOfPersons.size();
                }
                return new ArrayList<>(listOfPersons.subList(firstRow,
                        last));
            }
        },
                new LazyList.CountProvider() {

                    private static final long serialVersionUID = -3920880835334547231L;

                    @Override
            public int size() {
                return (int) Service.count();
            }
        }
        );

        Button b = new Button("Reset loading strategy (should maintain sorting)");
        b.addClickListener(e -> {
            g.lazyLoadFrom((int firstRow, boolean sortAscending, String property) -> {
                List<Person> listOfPersons = new ArrayList<>(orig);
                if (property != null) {
                    Collections.sort(listOfPersons, new BeanComparator<>(
                            property));
                    if (!sortAscending) {
                        Collections.reverse(listOfPersons);
                    }
                }
                int last = firstRow + LazyList.DEFAULT_PAGE_SIZE;
                if (last > listOfPersons.size()) {
                    last = listOfPersons.size();
                }
                return new ArrayList<>(listOfPersons.subList(firstRow,
                        last));
            }, () -> (int) Service.count());

        });

        return new MVerticalLayout(b, g);
    }

}
