package net.sf.jasperreports.charts.fill;

import net.sf.jasperreports.charts.JRCategorySeries;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRHyperlink;
import net.sf.jasperreports.engine.JRHyperlinkHelper;
import net.sf.jasperreports.engine.JRPrintHyperlink;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.fill.JRCalculator;
import net.sf.jasperreports.engine.fill.JRExpressionEvalException;
import net.sf.jasperreports.engine.fill.JRFillExpressionEvaluator;
import net.sf.jasperreports.engine.fill.JRFillHyperlinkHelper;
import net.sf.jasperreports.engine.fill.JRFillObjectFactory;

public class JRFillCategorySeries implements JRCategorySeries {
  protected JRCategorySeries parent = null;
  
  private Comparable series = null;
  
  private Comparable category = null;
  
  private Number value = null;
  
  private String label = null;
  
  private JRPrintHyperlink itemHyperlink;
  
  public JRFillCategorySeries(JRCategorySeries categorySeries, JRFillObjectFactory factory) {
    factory.put(categorySeries, this);
    this.parent = categorySeries;
  }
  
  public JRExpression getSeriesExpression() {
    return this.parent.getSeriesExpression();
  }
  
  public JRExpression getCategoryExpression() {
    return this.parent.getCategoryExpression();
  }
  
  public JRExpression getValueExpression() {
    return this.parent.getValueExpression();
  }
  
  public JRExpression getLabelExpression() {
    return this.parent.getLabelExpression();
  }
  
  protected Comparable getSeries() {
    return this.series;
  }
  
  protected Comparable getCategory() {
    return this.category;
  }
  
  protected Number getValue() {
    return this.value;
  }
  
  protected String getLabel() {
    return this.label;
  }
  
  protected JRPrintHyperlink getPrintItemHyperlink() {
    return this.itemHyperlink;
  }
  
  protected void evaluate(JRCalculator calculator) throws JRExpressionEvalException {
    this.series = (Comparable)calculator.evaluate(getSeriesExpression());
    this.category = (Comparable)calculator.evaluate(getCategoryExpression());
    this.value = (Number)calculator.evaluate(getValueExpression());
    this.label = (String)calculator.evaluate(getLabelExpression());
    if (hasItemHyperlinks())
      evaluateItemHyperlink(calculator); 
  }
  
  protected void evaluateItemHyperlink(JRCalculator calculator) throws JRExpressionEvalException {
    try {
      this.itemHyperlink = JRFillHyperlinkHelper.evaluateHyperlink(getItemHyperlink(), (JRFillExpressionEvaluator)calculator, (byte)3);
    } catch (JRExpressionEvalException e) {
      throw e;
    } catch (JRException e) {
      throw new JRRuntimeException(e);
    } 
  }
  
  public boolean hasItemHyperlinks() {
    return !JRHyperlinkHelper.isEmpty(getItemHyperlink());
  }
  
  public JRHyperlink getItemHyperlink() {
    return this.parent.getItemHyperlink();
  }
  
  public Object clone() {
    return null;
  }
}
