class Conversation < ActiveRecord::Base
  attr_writer :can_close
  attr_accessor :read_enter, :read_exit, :read_after_first, :read_after_second,
                :closed_after, :needs_attention_enter, :needs_attention_after

  acts_as_state_machine :initial => :needs_attention, :column => 'state_machine'

  state :needs_attention, :enter => Proc.new { |o| o.needs_attention_enter = true },
                          :after => Proc.new { |o| o.needs_attention_after = true }
                          
  state :read, :enter => :read_enter_action,
               :exit  => Proc.new { |o| o.read_exit  = true },
               :after => [:read_after_first_action, :read_after_second_action]

  state :closed, :after => :closed_after_action
  state :awaiting_response
  state :junk

  event :new_message do
    transitions :to => :needs_attention,   :from => [:read, :closed, :awaiting_response]
  end

  event :view do
    transitions :to => :read,              :from => [:needs_attention, :read]
  end
  
  event :reply do
    transitions :to => :awaiting_response, :from => [:read, :closed]
  end

  event :close do
    transitions :to => :closed,            :from => [:read, :awaiting_response], :guard => Proc.new {|o| o.can_close?}
    transitions :to => :read,              :from => [:read, :awaiting_response], :guard => :always_true
  end

  event :junk, :note => "finished" do
    transitions :to => :junk,              :from => [:read, :closed, :awaiting_response]
  end

  event :unjunk do
    transitions :to => :closed,            :from => :junk
  end

  def can_close?
    @can_close
  end

  def read_enter_action
    self.read_enter = true
  end

  def always_true
    true
  end

  def read_after_first_action
    self.read_after_first = true
  end

  def read_after_second_action
    self.read_after_second = true
  end

  def closed_after_action
    self.closed_after = true
  end
end