/**
 * サポート情報
 *
 * @param arg
 * @constructor
 */
var SupportModel = function SupportModel(arg) {
  this.data = arg.data;
};

/**
 * 検索条件に合致したデータを返却する
 *
 * @param condition
 *   category: 検索条件：機能分類
 *   function: 検索条件：機能
 * @returns {*}
 */
SupportModel.prototype.find = function find(condition) {
  var rows; // 条件に合致する見出し行のインデックスのリスト
  var result = _.clone(this.data);
  var item;

  if (!condition) {
    return result;
  }

  condition = _.merge({
    'category': null,
    'function': null
  }, condition);

  // 表示させる行のインデックスを取得する
  rows = _
    .chain(this.data.rows)
    .map(function(val, key) {
      // カテゴリ検索
      //   - Category列が含まれるか
      if (!!condition.category &&
        ! _.includes(condition.category, val.category)) {
        return;
      }

      // テキスト入力検索
      //   - Category列またはFeature列に検索語句が含まれるか（部分一致）
      if (!!condition['function'] &&
        ! _.includes(_.toLower(toText(val.category)), _.toLower(toText(condition['function']))) &&
        ! _.includes(_.toLower(toText(val['function'])), _.toLower(toText(condition['function'])))){
        return;
      }

      return key;
    })
    .filter(function(o){ return _.isNumber(o); })
    .value();

  // 条件に合致する行見出しを取得
  result.rows = _.at(this.data.rows, rows);

  // 条件に合致するサポート情報を取得
  result.columns = [];
  _.forEach(this.data.columns, function(val) {
    item = _.clone(val);
    item.supports = _.at(item.supports, rows);
    result.columns.push(item);
  });

  return result;
};
