package cnp.ew.grid;

import java.util.*;
import java.awt.*;
import cnp.ew.properties.*;

public class CpFormulaFunction extends CpFormulaExpression
{
    String name;
    Vector parameters;

    public CpFormulaFunction(String name, Vector parameters)
    {
        this.name = name;
        this.parameters = parameters;
    }

    public Object value(CpGridModel grid)
    {
        // ToDo:  Should typecheck arguments are integer

        if (name.equals("sum") || name.equals("average")) {
            boolean sum = (name.equals("sum"));

            Object range = parameters.elementAt(0);
            if (!(range instanceof CpFormulaRange)) {
               // System.out.println("Parameter is not a range");
                return null;
            }
            CpFormulaCell start = ((CpFormulaRange)range).start;
            CpFormulaCell end = ((CpFormulaRange)range).end;
            double value = 0;
            for (int c = start.cell.x; c <= end.cell.x; c++) {
                for (int r = start.cell.y; r <= end.cell.y; r++) {
                    double cellValue = grid.getCell(new Point(c, r)).getNumValue();
                    value += cellValue;
                }
            }
            if (name.equals("sum")) {
                return new Double(value);
            } else {
                return new Double(value / ((end.cell.x - start.cell.x + 1) * (end.cell.y - start.cell.y + 1)));
            }
        } else {
            //System.out.println("ERROR: unknown functio name: " + name);
            return null;
        }
    }

    public CpType getType()
    {
        return CpBasicType.NUMBER;
    }
}

