package inline;

import wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import wicket.extensions.markup.html.repeater.util.SortParam;
import wicket.model.IModel;
import wicket.model.Model;

import java.util.List;
import java.util.Iterator;
import java.util.Collections;
import java.util.Comparator;
import java.io.Serializable;

/**
 * A simple data provider for the Person objects.
 */
public class PersonDataProvider extends SortableDataProvider {
    private List<Person> people;

    public PersonDataProvider(List<Person> people) {
        this.people = people;
    }

    public IModel model(Object object) {
        return new Model((Serializable) object);
    }

    public int size() {
        return people.size();
    }

    public Iterator iterator(int i, int i1) {
        SortParam sp = getSort();
        if (sp != null) {
            if ("firstName".equals(sp.getProperty())) {
                Collections.sort(people, new FirstNameComparator(sp.isAscending()));
            } else if ("lastName".equals(sp.getProperty())) {
                Collections.sort(people, new LastNameComparator(sp.isAscending()));
            }
        }
        return people.subList(i, i + i1).iterator();
    }

    private static class FirstNameComparator implements Comparator<Person> {
        private boolean isAscending;

        public FirstNameComparator(boolean ascending) {
            isAscending = ascending;
        }

        public int compare(Person o1, Person o2) {
            if (isAscending) {
                return o1.getFirstName().compareTo(o2.getFirstName());
            }
            return o2.getFirstName().compareTo(o1.getFirstName());
        }
    }

    private static class LastNameComparator implements Comparator<Person> {
        private boolean isAscending;

        public LastNameComparator(boolean ascending) {
            isAscending = ascending;
        }

        public int compare(Person o1, Person o2) {
            if (isAscending) {
                return o1.getLastName().compareTo(o2.getLastName());
            }
            return o2.getLastName().compareTo(o1.getLastName());
        }
    }
}
