package page.image;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Arc2D;

import org.wikiwebserver.handler.http.FormData;
import org.wikiwebserver.handler.http.interfaces.*;
import org.wikiwebserver.util.CacheableDynamicImage;

public class Pie extends CacheableDynamicImage implements HTTPResponder {

    private float[] values = { 20, 35, 12, 7, 12 };
    private float[] arcs;    
    
    protected void init(FormData formData) {

        // Read posted data
        int width = (int) readValue(formData, "w", 100);
        int height = (int) readValue(formData, "h", 100);
        values = readValues(formData, "d", values);
        
        setSize(width, height);
    }  
    
    protected void paint(Graphics2D g2d) {
        
        g2d.setColor(Color.white);
        g2d.fillRect(0, 0, getWidth(), getHeight());
        
        Color[] colours = new Color[] {
                Color.green, Color.blue, Color.red, Color.yellow, Color.pink, 
                Color.cyan, Color.magenta, Color.orange
        };
        
        // Calculate sum of all the values
        int sum = 0;
        for (int i=0; i<values.length; i++) sum += values[i];
        
        // Calculate arc angles for pie chart
        arcs = new float[values.length];        
        for (int i=0; i<values.length; i++) {
            arcs[i] = (float)values[i] * 360 / sum;
        }
        // Draw pie chart anti-clockwise from 0 deg from right hand side.
        float prev = 0;
        for (int i=0; i<arcs.length; i++) {
            Arc2D.Float arc = new Arc2D.Float(1, 1, getWidth()-2, getHeight()-2, prev, arcs[i], Arc2D.PIE);
            prev += arcs[i]; // Determine new start of next arc
            g2d.setColor(colours[i%colours.length]);
            g2d.fill(arc);
            //g2d.setColor(Color.black);
            //g2d.draw(arc);
        }
    }
    
    private float readValue(FormData data, String key, float def) {
        float value = def;
        try {
            value = Integer.parseInt(data.getFirst(key));
        } catch (Exception ex) {}
        return value;
    }
    
    private float[] readValues(FormData data, String key, float[] def) {
        try {
            String[] items = data.getFirst(key).split(",");
            float[] values = new float[items.length];
            for (int i=0; i<items.length; i++) {
                values[i] = Integer.parseInt(items[i]);
            }
            return values;
        } catch (Exception ex) {}
        return def;
    }

    protected long getExpiry() {
        return System.currentTimeMillis() + 60 * 60 * 1000;
    }  
}
