class JournalMessage < ActiveRecord::Base
  include Redmine::SafeAttributes
  include RedmineHelpdesk::Concerns::Viewable
  include RedmineHelpdesk::Concerns::HelpdeskTicketsVisible

  belongs_to :contact
  belongs_to :journal
  has_one :message_file, class_name: 'Attachment', as: :container, dependent: :destroy

  attr_protected :id if ActiveRecord::VERSION::MAJOR <= 4
  safe_attributes 'source', 'from_address', 'to_address', 'bcc_address', 'cc_address', 'message_id', 'is_incoming', 'message_date', 'contact', 'journal'

  acts_as_attachable view_permission: :view_issues,
                     delete_permission: :edit_issues

  if ActiveRecord::VERSION::MAJOR >= 4
    acts_as_activity_provider type: 'helpdesk_tickets',
                              permission: :view_helpdesk_tickets,
                              timestamp: "#{table_name}.message_date",
                              author_key: "#{Journal.table_name}.user_id",
                              scope: eager_load({ journal: [{ issue: [:project, :tracker] }, :details, :user] }, :contact)
  else
    acts_as_activity_provider type: 'helpdesk_tickets',
                              permission: :view_helpdesk_tickets,
                              timestamp: "#{table_name}.message_date",
                              author_key: "#{Journal.table_name}.user_id",
                              find_options: { include: [{ journal: [{ issue: [:project, :tracker] }, :details, :user] }, :contact] }
  end

  acts_as_event title: Proc.new { |o| "#{o.journal.issue.tracker} ##{o.journal.issue.id}: #{o.journal.issue.subject}" if o.journal && o.journal.issue },
                datetime: :message_date,
                group: :helpdesk_ticket,
                project_key: "#{Project.table_name}.id",
                url: Proc.new { |o| { controller: 'issues', action: 'show', id: o.journal.issue.id, anchor: "change-#{o.id}" } if o.journal },
                type: Proc.new { |o| ('icon' + (o.is_incoming? ? ' icon-email' : ' icon-email-to')) },
                author: Proc.new { |o|  o.is_incoming? ? o.contact : o.journal.user },
                description: Proc.new { |o| o.journal.notes if o.journal }

  validates_presence_of :contact, :journal, :message_date

  def self.joined_model
    :journal
  end

  def project
    journal.project
  end

  def contact_name
    contact.name
  end

  def contact_email
    contact.emails.first
  end

  def helpdesk_ticket
    journal.issue.helpdesk_ticket
  end

  def content
    journal.notes
  end
end
