package data;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;

public class Search {
	ArrayList<Page> pages;

	ArrayList<Offer> offers;

	public static final int AREA = 0, PRICE = 1, AREA_PRICE = 2;

	float averageValue;

	public Search(String baseUrl) {
		pages = new ArrayList<Page>();
		pages.add(new Page(baseUrl));
		int totalPages = pages.get(0).totalResults / 25+1;
		// FIXME remove limit of 1
		for (int i = 2; i <= totalPages/* && i <= 1 */; i++) {
			System.out.println("Loading page " + i + " of " + totalPages);
			pages.add(new Page(baseUrl + "&start=" + i));
		}
		offers = new ArrayList<Offer>();
		for (Iterator<Page> iter = pages.iterator(); iter.hasNext();) {
			Page p = iter.next();
			offers.addAll(p.getOffers());
		}
		System.out.println("Total offers: " + offers.size());
	}

	public ArrayList<Offer> getOffers() {
		return offers;
	}

	public void sort(int order) {
		averageValue = 0;
		switch (order) {
		case AREA:
			Collections.sort(offers, new AreaCmp());
			for (Iterator<Offer> iter = offers.iterator(); iter.hasNext();) {
				Offer o = iter.next();
				averageValue += o.area;
			}
			break;
		case AREA_PRICE:
			Collections.sort(offers, new AreaPriceCmp());
			for (Iterator<Offer> iter = offers.iterator(); iter.hasNext();) {
				Offer o = iter.next();
				averageValue += o.areaPrice;
			}
			break;
		default:
			Collections.sort(offers, new PriceCmp());
			for (Iterator<Offer> iter = offers.iterator(); iter.hasNext();) {
				Offer o = iter.next();
				averageValue += o.price;
			}
		}
		averageValue /= offers.size();
		System.out.println("Average: " + averageValue);
	}

	class AreaCmp implements Comparator<Offer> {
		public int compare(Offer o1, Offer o2) {
			return o1.area < o2.area ? -1 : 1;
		}
	}

	class PriceCmp implements Comparator<Offer> {
		public int compare(Offer o1, Offer o2) {
			return o1.price < o2.price ? -1 : 1;
		}
	}

	class AreaPriceCmp implements Comparator<Offer> {
		public int compare(Offer o1, Offer o2) {
			return o1.areaPrice < o2.areaPrice ? -1 : 1;
		}
	}

	public float getAverageValue() {
		return averageValue;
	}
}