var CONFIG = CONFIG || {};
CONFIG.SEARCH_TIMEOUT = 300;
CONFIG.SEARCH_MIN_LENGTH = 0;

/**
 * メーカー一覧
 *
 * @param arg
 * @constructor
 */
var MakerView = function (arg) {
  this.$el = arg.$el;
  this.template = arg.template;
  this.compiled = _.template(this.template);
};

// 改修 中江　delete start
// MakerView.prototype.render = function(items) {
//  this.$el.html(this.compiled({items: items}));
//};
// 改修 中江　delete end

// 改修 中江 add start
// 引数にports("port-types")を追加 20170612
MakerView.prototype.render = function (items) {
  this.$el.html(this.compiled({ items: items }));
  $(window).trigger('render');
};
// 引数　中江 add end

/**
 * メーカー一覧データ
 *
 * @param arg
 * @constructor
 */
var MakerModel = function MakerModel(arg) {
  this.data = arg.data;  // 20190723 fix[nishino]
};
MakerModel.prototype.find = function find(condition) {
  if (!condition) {
    return this.data;  // 20190723 fix[nishino]
  }

  condition = _.merge({
    manufacturer: null
  }, condition);

  if (!condition.manufacturer) {
    return this.data;  // 20190723 fix[nishino]
  }

  // 検索条件とマッチするデータのみに絞り込み
  return _.filter(this.data, function (item) {
    var target  = _.toLower(zenkakuToHankaku(item['maker-nm']));
    var keyword = _.toLower(zenkakuToHankaku(condition.manufacturer));
    if (_.includes(target, keyword)) {
      return true;
    }

    return false;
  });
};
/**
 * リストを取得
 * @param {string} propName プロパティ名
 * @returns {*}
 */
MakerModel.prototype.findList = function findList (propName) {
  return _(this.data)  // 20190723 fix[nishino]
    .map(function (item) {
      return item[propName];
    })
    .uniq()
    .value();
};

// 改修 中江　20170612 add　start
/**
 * ポート種別フラグマスタ
 // * @param {[type]} arg
 * @constructor
 */
var PortModel = function PortModel() {
  this.data = data_conf;  // 20190723 add[nishino] conf.jsの情報
};
PortModel.prototype.find = function find() {
  return this['data']['port-types'];
};
// 改修 中江 add end

var App = function App (arg) {
  this.$searchForm = arg.$searchForm;
  this.makerModel = arg.makerModel;
  this.makerView = arg.makerView;
};

/**
 * 初期化処理
 */
App.prototype.initialize = function initialize () {
  new AutoCompleteView({
    $el: $('[name=manufacturer]'),
    source: this.makerModel.findList('maker-nm')
  }).initialize();
};

/**
 * 検索条件を取得
 *
 * @returns {*}
 */
App.prototype.getCondition = function getCondition () {
  return this.$searchForm.serializeObject();
};

/**
 * ハイライト処理を実行
 */
App.prototype.highlight = function highlight(condition) {
  $('.js-hl-target-manufacturer').highlight(condition.manufacturer);
};

/**
 * 検索処理を実行
 */
App.prototype.search = function search () {
  var condition, makerData;

  condition = this.getCondition();

  makerData = this.makerModel.find(condition);
  this.makerView.render(makerData);

  this.highlight(condition);
};

var app, makerView, makerModel, portModel;
$(function () {
  var makerModelAry, portModelAry, displayTypeString, portTypeAry, conditionObj;

  makerView = new MakerView({
    $el: $('table').find('tbody'),
    template: $('#template').text()
  });

  makerModel = new MakerModel({
    data: data
  });

  // 改修 中江　20170612 add start
  portModel = new PortModel({
    // data: data  // 20190723 delete[nishino] data_conf.jsから直接取得
  });

  makerModelAry = makerModel.find();
  portModelAry = portModel.find();

  // ▼▼ メーカー設定配列の各レコードのシステム構成図表示タイプから、
  // ▼▼ 紐づくポートデータをポート種別配列から取得して、メーカー設定配列に追加する
  _.each(makerModelAry, function (item, makerIndex) {
    displayTypeString = item['display-type'];
    portTypeAry = [];

    _.each(displayTypeString, function (displayChar, displayIndex) {
      if (displayChar != 0) {
        conditionObj = { 'port-type-flg': String(displayIndex + 1) };

        portTypeAry.push(_.find(portModelAry, conditionObj));
      }
    });

    // 重複行の削除
    portTypeAry = _.compact(portTypeAry);

    // sort-no(表示順)でソート
    portTypeAry = _.sortBy(portTypeAry, 'sort-no');

    // メーカー設定配列の各要素に紐づくポート種別配列を追加する
    makerModelAry[makerIndex]['portTypeAry'] = portTypeAry;
  });
  // 改修 中江 add end

  // 改修 中江 20170612 delete start
  //makerView.render(makerModel.find());
  // 改修 中江 delete end
  // 改修 中江　20170612 add start
  makerView.render(makerModelAry);
  // 改修 中江　add end

  // 初期データの collection にポート種別の情報を追加
  // data.collection = makerModelAry;  // 20190719 delete[nishino]
  app = new App({
    $searchForm: $('.js-condition-form'),
    makerModel: new MakerModel({ data: data }),
    makerView: makerView
  });

  // 初期化
  app.initialize();

  $('.js-condition')
    .observeUpdate(CONFIG.SEARCH_TIMEOUT, CONFIG.SEARCH_MIN_LENGTH)
    .bind('change update', function (ev) {
      app.search();
    });

  // 検索条件をリセット
  $(document).on('click', '.js-btn-reset', function (e) {
    e.preventDefault();
    $('.js-condition').val('').trigger('change');
  });

  $(document).on('click', '.js-box', function (e) {
    // 詳細画面に遷移する前に検索条件をクリア
    DB.set('plc_detail', {});
  });

  // FORMの送信を抑止
  $(document).on('submit', 'form', function (ev) {
    ev.preventDefault();
  });

  // リンクにマウスオーバーした場合, リンクにフォーカスを当てる
  $(document).on('mouseover', '.js-focusable', function () {
    $(this).trigger('focus');
  });
});







(function($){
    $(function(){
      $('.maker-table').css('top', $('.content-header').outerHeight());
      fixTableThead('.maker-table');
    });
})(jQuery);
