module Rad
  module Processors    
    class LetterBuilder < Processor
      def call                
        # prepare
        controller = workspace.controller.must_be.present
        raise "The controller #{controller} must be a Rad::MailController!" unless controller.is_a? Rad::MailController
        action = workspace.action = workspace.method_name

        # call
        content = catch :halt_render do
          controller.run_callbacks :action, method: action do          
            # call controller
            controller.send action, *workspace.arguments
            # render view
            controller.render action: action          
          end
        end
        
        controller.body = content unless content.blank?
        
        # letter
        workspace.letter = ::Rad::Letter.new(
          from: controller.from,
          to: controller.to,
          subject: controller.subject,
          body: controller.body
        )
        workspace.letter.validate!
        
        next_processor.call if next_processor
      end          
    
    end    
  end
end