const mongoose = require('mongoose');
const Schema = mongoose.Schema;

mongoose.Promise = global.Promise;
mongoose.level = "F";

const tools = require('../tools/general');

const { ObjectID } = require('mongodb');

const { Settings } = require('./settings');

// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
  schema.options.usePushEach = true
});

const MyEventSchema = new Schema({
  idapp: {
    type: String,
  },
  typol: {
    type: String,
  },
  short_tit: {
    type: String,
  },
  title: {
    type: String,
  },
  details: {
    type: String,
  },
  bodytext: {
    type: String,
  },
  dateTimeStart: {
    type: Date,
  },
  dateTimeEnd: {
    type: Date,
  },
  bgcolor: {
    type: String,
  },
  icon: {
    type: String,
  },
  img_small: {
    type: String,
  },
  img: {
    type: String,
  },
  wherecode: {
    type: String,
  },
  contribtype: {
    type: String,
  },
  price: {
    type: Number,
  },
  infoafterprice: {
    type: String,
  },
  teacher: {
    type: String,
  },
  teacher2: {
    type: String,
  },
  infoextra: {
    type: String,
  },
  linkpage: {
    type: String,
  },
  linkpdf: {
    type: String,
  },
  nobookable: {
    type: Boolean,
  },
  news: {
    type: Boolean,
  },
  canceled: {
    type: Boolean,
  },
  deleted: {
    type: Boolean,
  },
  dupId: {
    type: mongoose.Schema.Types.ObjectId,
  },
  modified: {
    type: Boolean,
  },
});

MyEventSchema.statics.findAllIdApp = function (idapp) {
  const Event = this;

  const query = [
    { $match: { idapp } },
    { $sort: { dateTimeStart: 1 } }
  ];

  return Event
    .aggregate(query)
    .then((arrrec) => {
      return arrrec
    })

};

MyEventSchema.statics.getLastEvents = async function (idapp) {
  const Event = this;

  const lastn = await Settings.getValDbSettings(idapp, 'SHOW_LAST_N_EV', 1);

  const query = [
    { $match: { idapp, dateTimeStart: { $gte: tools.IncDateNow(-1000 * 60 * 60 * 24) } } },
    {
      $lookup: {
        from: 'operators',
        localField: 'teacher',
        foreignField: 'username',
        as: 'op1'
      }
    },
    {
      $lookup: {
        from: 'operators',
        localField: 'teacher2',
        foreignField: 'username',
        as: 'op2'
      }
    },
    { "$addFields": { "contribtype": { "$toObjectId": "$contribtype" } } },
    {
      $lookup: {
        from: 'contribtypes',
        localField: 'contribtype',
        foreignField: '_id',
        as: 'contrib'
      }
    },
    { $sort: { dateTimeStart: 1 } }
  ];

  return Event
    .aggregate(query)
    .then((arrrec) => {
      // console.table(arrrec);
      if (lastn > 0) {
        return arrrec.slice(0, lastn);
      } else {
        return arrrec
      }
    })

};


MyEventSchema.statics.getFieldsForSearch = function () {
  return [{ field: 'short_tit', type: tools.FieldType.string },
    { field: 'title', type: tools.FieldType.string },
    { field: 'teacher', type: tools.FieldType.string },
    { field: 'details', type: tools.FieldType.string }]
};

MyEventSchema.statics.executeQueryTable = function (idapp, params) {
  params.fieldsearch = this.getFieldsForSearch();
  return tools.executeQueryTable(this, idapp, params);
};

if (tools.INITDB_FIRSTIME) {
  // console.log('   createIndex MyEvent Index...');
  // MyEventSchema.index({ short_tit: 'text', title: 'text', teacher: 'text', details: 'text' });
}


const MyEvent = mongoose.model('MyEvent', MyEventSchema);

module.exports = { MyEvent };
