# -*- encoding : utf-8 -*-
module ActiveModel
  class Errors
    # Redefine the ActiveModel::Errors::full_messages method:
    #  Returns all the full error messages in an array. 'Base' messages are handled as usual.
    #  Non-base messages are prefixed with the attribute name as usual UNLESS 
    # (1) they begin with '^' in which case the attribute name is omitted.
    #     E.g. validates_acceptance_of :accepted_terms, :message => '^Please accept the terms of service'
    # (2) the message is a proc, in which case the proc is invoked on the model object.
    #     E.g. validates_presence_of :assessment_answer_option_id, 
    #     :message => Proc.new { |aa| "#{aa.label} (#{aa.group_label}) is required" }
    #     which gives an error message like:
    #     Rate (Accuracy) is required
    def full_messages
      full_messages = []

      each do |attribute, messages|
        messages = Array.wrap(messages)
        next if messages.empty?

        if attribute == :base
          messages.each {|m| full_messages << m }
        else
          attr_name = attribute.to_s.gsub('.', '_').humanize
          attr_name = @base.class.human_attribute_name(attribute, :default => attr_name)
          options = { :default => "%{attribute} %{message}", :attribute => attr_name }

          messages.each do |m|
            if m =~ /^\^/
              options[:default] = "%{message}"
              full_messages << I18n.t(:"errors.dynamic_format", options.merge(:message => m[1..-1]))
            elsif m.is_a? Proc
              options[:default] = "%{message}"
              full_messages << I18n.t(:"errors.dynamic_format", options.merge(:message => m.call(@base)))
            else
              full_messages << I18n.t(:"errors.format", options.merge(:message => m))
            end            
          end
        end
      end

      full_messages
    end
  end
end

require 'active_support/i18n'
I18n.load_path << File.dirname(__FILE__) + '/locale/en.yml'
