package net.sf.jasperreports.charts.fill;

import java.util.Date;
import net.sf.jasperreports.charts.JRTimeSeries;
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 JRFillTimeSeries implements JRTimeSeries {
  protected JRTimeSeries parent = null;
  
  private Comparable series = null;
  
  private Date timePeriod = null;
  
  private Number value = null;
  
  private String label = null;
  
  private JRPrintHyperlink itemHyperlink;
  
  public JRFillTimeSeries(JRTimeSeries timeSeries, JRFillObjectFactory factory) {
    factory.put(timeSeries, this);
    this.parent = timeSeries;
  }
  
  public JRExpression getSeriesExpression() {
    return this.parent.getSeriesExpression();
  }
  
  public JRExpression getTimePeriodExpression() {
    return this.parent.getTimePeriodExpression();
  }
  
  public JRExpression getValueExpression() {
    return this.parent.getValueExpression();
  }
  
  public JRExpression getLabelExpression() {
    return this.parent.getLabelExpression();
  }
  
  protected Comparable getSeries() {
    return this.series;
  }
  
  protected Date getTimePeriod() {
    return this.timePeriod;
  }
  
  protected Number getValue() {
    return this.value;
  }
  
  protected String getLabel() {
    return this.label;
  }
  
  protected void evaluate(JRCalculator calculator) throws JRExpressionEvalException {
    this.series = (Comparable)calculator.evaluate(getSeriesExpression());
    this.timePeriod = (Date)calculator.evaluate(getTimePeriodExpression());
    this.value = (Number)calculator.evaluate(getValueExpression());
    this.label = (String)calculator.evaluate(getLabelExpression());
    if (hasItemHyperlink())
      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 JRHyperlink getItemHyperlink() {
    return this.parent.getItemHyperlink();
  }
  
  public boolean hasItemHyperlink() {
    return !JRHyperlinkHelper.isEmpty(getItemHyperlink());
  }
  
  public JRPrintHyperlink getPrintItemHyperlink() {
    return this.itemHyperlink;
  }
  
  public Object clone() {
    return null;
  }
}
