class FnordMetric::Context

  include FnordMetric::GaugeModifiers

  class Proxy

    def initialize(_ref)
      @ref = _ref
    end

    def method_missing(method, *args, &block)
      @ref.dispatch(method, *args, &block)
    end

  end

  def initialize(opts, block)
    @block = block
    @opts = opts    
  end

  def call(event, redis)
    @redis = redis
    @event = event    
    proxy.instance_eval(&@block)
  rescue Exception => e
    raise e if ENV['FNORDMETRIC_ENV'] == 'test'
    puts "error: #{e.message}"
    puts e.backtrace.push("").join("\n") if ENV['FNORDMETRIC_ENV'] == 'dev'
  end

  def proxy
    @proxy ||= Proxy.new(self)
  end

  def dispatch(method, *args, &block)
    if args.size > 0 && @opts[:gauges][args[0]].try(:renderable?)
      @opts[:gauges][args.delete_at(0)].execute(method, *args.unshift(self), &block)
    else
      send(method, *args, &block)
    end
  rescue Exception => e
    raise e if ENV['FNORDMETRIC_ENV'] == 'test'
    puts "error: #{e.message}"
    puts e.backtrace.push("\n").join("\n") if ENV['FNORDMETRIC_ENV'] == 'dev'
  end

  def redis_exec(*args)
    @redis.send(*args)
  end

private

  def session_key
    @event[:_session_key]
  end

  def data
  	@event
  end

  def key(gauge)
    fetch_gauge(gauge).key
  end

  def time
    @event[:_time].to_i
  end

protected
  
  def fetch_gauge(_gauge)
    _gauge.is_a?(FnordMetric::Gauge) ? _gauge : @opts[:gauges].fetch(_gauge)
  rescue
    error! "error: gauge '#{_gauge}' is undefined"
  end

  def error!(msg)
    FnordMetric.error(msg)
  end


end