require 'amrita2/template'

require 'action_view'

module ActionView # :nodoc: all
  class Base #:nodoc:
    include Amrita2::Runtime
  end
end

module ActiveRecord # :nodoc: all
  class Base
    include Amrita2::DictionaryData
  end
  
  class ConnectionAdapters::Column 
    include Amrita2::DictionaryData
  end
end

module ActionController  # :nodoc: all
  class Pagination::Paginator
    include Amrita2::DictionaryData
  end
end


module Amrita2View # :nodoc: all
  class Base
    include Amrita2
    include Amrita2::Filters
    include Amrita2::Runtime
    include Amrita2::Util

    CompileTimeBinding = binding
    @@compiled_amrita2_templates = {}

    @@text_domain = nil
    cattr_accessor :text_domain

    def initialize( action_view )
      @action_view = action_view
    end

    def render(template, local_assigns={})
      Thread::current[:amrita_rails_view] = @action_view
      if template.kind_of?(String)
        render_amrita(template, local_assigns)
      else
        @action_view.render(template, local_assigns)
      end
    end

    def setup_template(template)
      setup_template_default(template)
    end

    def setup_template_default(template)
      if Amrita2::const_defined?(:GetTextBridge)
        t = Amrita2::Template.new(template) do |e, src, filters|
          filters << Amrita2::Filters::GetTextFilter.new
        end
        t.text_domain = text_domain
        bindtextdomain(t.text_domain)
        #t.set_trace(STDOUT)
        t.compiletime_binding = CompileTimeBinding
        t
      else
        t = Amrita2::Template.new(template)
        t.compiletime_binding = CompileTimeBinding
        t
      end
    end

    def render_amrita(template, local_assigns)
      @@compiled_amrita2_templates[template] ||= setup_template(template)
      tmpl = @@compiled_amrita2_templates[template]
      b = setup_binding_of_view(local_assigns)
      tmpl.render_with(b)
    end

    def setup_binding_of_view(local_assigns)
      @action_view.instance_eval do
        evaluate_assigns
        b = binding
        local_assigns.each do |k, v|
          amrita_set_context_value(v)
          eval "#{k}=amrita_get_context_value",b
        end
        b
      end
    end
  end
  module Helper
    include ActionView::Helpers::UrlHelper

    def view
      @view ||=  Thread::current[:amrita_rails_view]
    end

    def eval_in_view(&block)
      view.instance_eval &block
    end

    def eval_in_view_without_escape(&block)
      Amrita2::SanitizedString[eval_in_view(&block)]
    end
  end
end

=begin

  class WithObject < Amrita2::Macro::Base
    TemplateText = <<-'END'
      <<%<
        <% Thread::current[:amrita2_form_object] = $_[:name] || $_[:object] %>
      <<_ :| Attr[:target_src=>:object]<
        <<:contents>>
    END

    Option = {
      :tag => "a:with_object",
      :use_contents => :contents,
    }

  end

  class Input < Amrita2::Macro::Base
    TemplateText = <<-'END'
      <<%<
        <%
          object = $_.delete(:object) || Thread::current[:amrita2_form_object]
          input_id  = $_.delete(:id)
          other = $_.collect do |k, v|
            "#{k}='#{v}'"
          end
         %>
        <input id="<%= object %>_<%= input_id %>" name="<%= object %>[<%= input_id%>]" <%= other %> target_filter="Attr[:value=><%= input_id.intern.inspect %>]"/>
    END

    Option = {
      :tag => "a:input"
    }
  end

  class TextField < Amrita2::Macro::Base
    TemplateText = <<-'END'
      <<%<
        <%
          object = $_.delete(:object) || Thread::current[:amrita2_form_object]
          input_id  = $_.delete(:id)
          $_[:size] ||= 30
          other = $_.collect do |k, v|
            "#{k}='#{v}'"
          end
         %>
        <input type="text" id="<%= object %>_<%= input_id %>" name="<%= object %>[<%= input_id%>]" <%= other %> target_filter="Attr[:value=><%= input_id.intern.inspect %>]"/>
    END

    Option = {
      :tag => "a:text_field",
    }
  end

  class TextArea < Amrita2::Macro::Base
    TemplateText = <<-'END'
      <<%<
        <%
          object = $_.delete(:object) || Thread::current[:amrita2_form_object]
          input_id  = $_.delete(:id)
          $_[:cols] ||= 40
          $_[:rows] ||= 20
          other = $_.collect do |k, v|
            "#{k}='#{v}'"
          end
         %>
        <textarea id="<%= object %>_<%= input_id %>" name="<%= object %>[<%= input_id%>]" <%= other %> target_filter="Attr[:body=><%= input_id.intern.inspect %>]"/>
    END

    Option = {
      :tag => "a:textarea",
    }
  end
=end