package gui;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JPanel;

import data.Offer;
import data.Search;

public class GraphPanel extends JPanel {
	// Generated by Eclipse
	private static final long serialVersionUID = 1L;

	ArrayList<Offer> offers;

	int sortOrder;

	float average;

	public void init(ArrayList<Offer> offers, int sortOrder, float avg) {
		this.offers = offers;
		this.sortOrder = sortOrder;
		average = avg;
		this.repaint();
	}

	private double getStrWidth(Graphics g, Offer o) {
		NumberFormat.getInstance().setMinimumIntegerDigits(10);
		String minimum = "" + getValue(o);
		System.out.println(minimum);
		FontRenderContext frc = ((Graphics2D) g).getFontRenderContext();
		Rectangle2D bounds = this.getFont().getStringBounds(minimum, frc);
		return bounds.getWidth() + 3;
	}

	public void paint(Graphics g) {
		Dimension size = getSize();
		g.clearRect(0, 0, size.width, size.height);
		if (offers == null || offers.size() == 0) {
			return;
		}
		double off1 = getStrWidth(g, offers.get(0));
		double off2 = getStrWidth(g, offers.get(offers.size() - 1));
		double xoff = Math.max(off1, off2);
		System.out.println("" + getValue(offers.get(0)));
		g.drawString("" + getValue(offers.get(0)), 0, size.height - 2);
		g.drawString("" + getValue(offers.get(offers.size() - 1)), 0, 10);
		g.drawLine((int) xoff, 0, (int) xoff, size.height);
		g.drawLine(0, size.height - 1, size.width, size.height - 1);
		int height = size.height;
		double coeff = height / getValue(offers.get(offers.size() - 1));
		double lastY = height - (coeff * getValue(offers.get(0)));
		double lastX = xoff;
		double xdiff = (size.getWidth() - xoff) / offers.size();

		g.drawLine((int) xoff, (int) (average * coeff), size.width, (int) (average * coeff));
		System.out.println("AVG: " + average + " " + coeff + " " + average * coeff);
		for (Iterator<Offer> iter = offers.iterator(); iter.hasNext();) {
			Offer o = iter.next();
			System.out.println(o);
			double x = lastX + xdiff;
			double y = height - (coeff * getValue(o));
			System.out.println(x + " " + y);
			g.drawLine((int) lastX, (int) lastY, (int) x, (int) y);
			lastX = x;
			lastY = y;
		}
	}

	float getValue(Offer o) {
		switch (sortOrder) {
		case Search.AREA:
			return o.getArea();
		case Search.AREA_PRICE:
			return o.getAreaPrice();
		default:
			return o.getPrice();
		}
	}
}