#encoding: utf-8
class ActionPrinter < ActionView::Base
 
  include Exceptions

  attr_accessor :printer, :paper

  def initialize(printer,paper)
    @printer=printer
    @paper=paper
    super(Rails.configuration.paths['app/views'])
  end

  def command
    @printer.command
  end

  #
  # the default rendering is from a string of chars to an html file - statically placed
  # for who ever knows the exact path to the file, to see
  #
  def do_render(print_job,*args)
    path = print_job.view_template_path
    # TODO vi får en fejl her når vi begynder at mixe modellerne f.eks. Employee.find_by_sql('select * from products')
		rc = print_job.printing_class.constantize
		coll = rc.find_by_sql( print_job.print_sql)
    locals = { resource_class: rc, collection: coll, resource: coll.first  }
    #
    # TODO args must be mergeable ;)
    # if args.flatten.compact.any?
    #   locals.merge! args
    # end

		#
		# this is WorkInProgress
		#
    if (path =~/^---/) # this will return falsy if found
      of = html_file render_string_in path.gsub( /^---/, ''), locals
    else
      of = html_file render( file: path, formats: [:html], handlers: [:haml,:erb], locals: locals)
    end
    #
		#
    logit :info, "created a html file: #{of.path}"

    of.path
  end

  # the default print is sending a link to the user who ordered the print
  def do_print copies, usr=nil
    # move pdf_file_path to a static place where it will not be accidentally deleted from
    # static_path = File.join(Rails.root,'public','files','1.pdf')
    # var = %x[ mv #{pdf_file_path} #{static_path}  2>&1 ]
    # send email to usr with link
    # raise MovingFileFailedError.new(var) unless var.blank?
    PrinterMailer.send_print(usr,file_path).deliver_now if usr
    true
  end

  #
  # this is WorkInProgress !!
  #
  def render_string_in content, locals
    render body: Haml::Engine.new( ERB.new(content).result ).render
  end

  #
  # build a temp file with the HTML string rendered and provided as argument str
  def html_file str, type='html'
    f = Tempfile.new(['print', ".#{type}"])
    f.puts str
    f.close
    Rails.logger.info "oxen: wrote #{f.path}"
    f
  end

  def text_file str
    html_file str, 'label'
  end

  def file_path
    raise "must be implemented on the driver!!"
  end

  def label_file_path
    @label_file_path ||= `mktemp -t lblXXXX`[0..-2]
  end

  def pdf_file_path
    @pdf_file_path ||= `mktemp -t pdfXXXX`[0..-2]
  end

  def get_file_type
    raise "you must implement this on the driver!!"
  end

  def send_print_file context
    context.send_file pdf_file_path, filename: 'oxen_file', type: get_file_type, disposition: "attachment"
    # context.cookies['fileDownload'] = 'true'
    # File.open(pdf_file_path, 'r') do |fp|
    #   context.send_data fp.read.force_encoding('BINARY'), filename: 'oxen_file', type: "application/pdf", disposition: "attachment"
    # end
  end

  def logit( log_type, msg )
    Rails.logger.send(log_type, "[OXEN] #{Time.now} [#{log_type.to_s}] #{msg}")
  end

end