class Card
  class Action
    # a collection of methods for comparing actions
    module Differ
      # # compare action's name value with previous name value
      # # @return [rendered diff]
      # def name_diff opts={}
      #   return unless new_name?
      #
      #   diff_object(:name, opts).complete
      # end

      # does action change card's name?
      # @return [true/false]
      def new_name?
        !value(:name).nil?
      end

      # @return [rendered diff]
      # compare action's cardtype value with previous cardtype value
      def cardtype_diff opts={}
        return unless card && new_type?

        diff_object(:cardtype, opts).complete
      end

      # does action change card's type?
      # @return [true/false]
      def new_type?
        !value(:type_id).nil?
      end

      # @return [rendered diff]
      # compare action's content value with previous content value
      def content_diff diff_type=:expanded, opts=nil
        return unless new_content?

        dobj = content_diff_object(opts)
        diff_type == :summary ? dobj.summary : dobj.complete
      end

      # does action change card's content?
      # @return [true/false]
      def new_content?
        !value(:db_content).nil?
      end

      # # test whether content was visibly removed
      # # @return [true/false]
      # def red?
      #   content_diff_object.red?
      # end
      #
      # # test whether content was visibly added
      # # @return [true/false]
      # def green?
      #   content_diff_object.green?
      # end

      def raw_view content=nil
        original_content = card.db_content
        card.db_content = content || value(:db_content)
        card.format.render_raw
      ensure
        card.db_content = original_content
      end

      def summary_diff_omits_content?
        content_diff_object.summary_omits_content?
      end

      private

      def diff_object field, opts
        Card::Content::Diff.new previous_value(field), value(field), opts
      end

      def content_diff_object opts=nil
        @content_diff_object ||= begin
          diff_args = opts || card.include_set_modules.diff_args
          previous_value = previous_value(:content)
          previous = previous_value ? raw_view(previous_value) : ""
          current = raw_view
          Card::Content::Diff.new previous, current, diff_args
        end
      end
    end
  end
end
