class Marty::DataImportView < Marty::CmFormPanel
  include Marty::Extras::Layout

  action :apply do |a|
    a.text    = I18n.t("data_import_view.import")
    a.tooltip = I18n.t("data_import_view.import")
    a.icon    = :database_go
  end

  js_configure do |c|

    c.set_result = <<-JS
      function(html) {
        var result = this.netzkeGetComponent('result');
        result.updateBodyHtml(html);
      }
      JS

    c.init_component = <<-JS
      function() {
        var me = this;
        me.callParent();
        var form = me.getForm();

        var comboname = form.findField('import_type');
        var textname  = form.findField('import_data');
        var importbutton = me.actions["apply"].items[0];

        comboname.on('select', function(combo, record) {
          textname.setValue("");
          me.netzkeGetComponent('result').updateBodyHtml('');
        });

        importbutton.on('click', function(t, e, ops) {
          me.netzkeGetComponent('result').updateBodyHtml('');
        });
      }
      JS
  end

  ######################################################################

  endpoint :netzke_submit do |params, this|
    data = ActiveSupport::JSON.decode(params[:data])

    import_data, import_type =
      data["import_data"] || "", data["import_type"] || ""

    return this.netzke_feedback("Must provide import data.") if
      import_data.empty?

    return this.netzke_feedback("Must provide import type") if
      import_type.empty?

    import_type_rec = Marty::ImportType.find_by_name(import_type)

    return this.netzke_feedback("Import type #{import_type} not found") unless
      import_type_rec

    return this.netzke_feedback("Insufficient permissions to run " +
                                "the data import") unless
      import_type_rec.allow_import?

    klass               = import_type_rec.get_model_class
    cleaner_function    = import_type_rec.cleaner_function
    validation_function = import_type_rec.validation_function

    begin
      res = Marty::DataImporter.do_import_summary(klass,
                                                  import_data,
                                                  'infinity',
                                                  cleaner_function,
                                                  validation_function,
                                                  )

      result = res.map { |k, v|
        case k
        when :clean  then "#{v} record(s) cleaned."
        when :same   then "#{v} record(s) unchanged."
        when :create then "#{v} record(s) created."
        when :update then "#{v} record(s) updated."
        when :blank  then "#{v} empty lines."
        end
      }

      this.set_result result.join("<br/>")
    rescue Marty::DataImporterError => exc
      result = [
                "Import failed on line(s): #{exc.lines.join(', ')}",
                "Error: #{exc.to_s}",
               ]

      this.set_result '<font color="red">' + result.join("<br/>") + "</font>"
    end
  end

  def configure(c)
    super

    c.title = I18n.t("data_import_view.import_data")
    c.items =
      [
       fieldset(I18n.t("data_import_view.select"),
                {
                  xtype:           :combo,
                  name:            "import_type",
                  store:           Marty::ImportType.all.map(&:name).sort,
                  max_width:       "350",
                  hide_label:      true,
                  force_selection: true,
                },
                {
                  name:         "import_data",
                  width:        "100%",
                  height:       300,
                  xtype:        :textareafield,
                  value:        "",
                  auto_scroll:  true,
                  hide_label:   true,
                  spellcheck:   false,
                  field_style: {
                    font_family: 'courier new',
                    font_size:   '12px'
                  },
                },
                min_width: 700,
                ),
       :result,
      ]
  end

  component :result do |c|
    c.klass       = Marty::CmPanel
    c.title       = I18n.t("data_import_view.results")
    c.html        = ""
    c.flex        = 1
    c.min_height  = 150
    c.auto_scroll = true
  end
end

DataImportView = Marty::DataImportView