module Netzke
  module Basepack
    class QueryBuilder < Netzke::Base
      js_base_class "Ext.tab.Panel"

      js_property :active_tab, 0

      js_translate :overwrite_confirm, :overwrite_confirm_title, :delete_confirm, :delete_confirm_title

      js_mixin :query_builder

      component :search_panel do
        {
          :class_name => "Netzke::Basepack::SearchPanel",
          :model => config[:model],
          :fields => config[:fields],
          :preset_query => config[:query],
          :auto_scroll => config[:auto_scroll]
        }
      end

      action :clear_all do
        {
          :text => I18n.t('netzke.basepack.query_builder.actions.clear_all'),
          :tooltip => I18n.t('netzke.basepack.query_builder.actions.clear_all_tooltip'),
          :icon => :cross
        }
      end

      action :reset do
        {
          :text => I18n.t('netzke.basepack.query_builder.actions.reset'),
          :tooltip => I18n.t('netzke.basepack.query_builder.actions.reset_tooltip'),
          :icon => :application_form
        }
      end

      action :save_preset do
        {
          :text => I18n.t('netzke.basepack.query_builder.actions.save_preset'),
          :tooltip => I18n.t('netzke.basepack.query_builder.actions.save_preset_tooltip'),
          :icon => :disk
        }
      end

      action :delete_preset do
        {
          :text => I18n.t('netzke.basepack.query_builder.actions.delete_preset'),
          :tooltip => I18n.t('netzke.basepack.query_builder.actions.delete_preset_tooltip'),
          :icon => :cross
        }
      end

      action :apply do
        {
          :text => I18n.t('netzke.basepack.query_builder.actions.apply'),
          :tooltip => I18n.t('netzke.basepack.query_builder.actions.apply_tooltip'),
          :icon => :accept
        }
      end

      def js_config
        super.tap do |s|
          s[:bbar] = (config[:bbar] || []) + [:clear_all.action, :reset.action, "->",
            I18n.t('netzke.basepack.query_builder.presets'),
            {
              :itemId => "presetsCombo",
              :xtype => "combo",
              :triggerAction => "all",
              :value => super[:load_last_preset] && last_preset.try(:fetch, "name"),
              :store => state[:presets].blank? ? [[[], ""]] : state[:presets].map{ |s| [s["query"], s["name"]] },
              :ref => "../presetsCombo",
              :listeners => {:before_select => {
                :fn => "function(combo, record){
                  var form = Ext.getCmp('#{global_id}');
                  form.buildFormFromQuery(record.data.field1);
                }".l
              }}
            }, :save_preset.action, :delete_preset.action
          ]
        end
      end

      endpoint :save_preset do |params|
        saved_searches = state[:presets] || []
        existing = saved_searches.detect{ |s| s["name"] == params[:name] }
        query = ActiveSupport::JSON.decode(params[:query])
        if existing
          existing["query"].replace(query)
        else
          saved_searches << {"name" => params[:name], "query" => query}
        end
        update_state(:presets, saved_searches)
        {:netzke_feedback => I18n.t('netzke.basepack.query_builder.preset_saved')}
      end

      endpoint :delete_preset do |params|
        saved_searches = state[:presets]
        saved_searches.delete_if{ |s| s["name"] == params[:name] }
        update_state(:presets, saved_searches)
        {:netzke_feedback => I18n.t('netzke.basepack.query_builder.preset_deleted')}
      end


    end
  end
end