const mongoose = require('mongoose').set('debug', false);
const Schema = mongoose.Schema;

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

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

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

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

const MySkillSchema = new Schema({
  _id: {
    type: Number,
  },
  idapp: {
    type: String,
    required: true,
  },
  userId: {type: Schema.Types.ObjectId, ref: 'User'},
  idSector: {
    type: Number,
  },
  idSkill: {
    type: Number,
    default: 0,
  },
  idSubSkill: [
    {
      type: Number,
      default: 0,
    }],
  idStatusSkill: [
    {
      type: Number,
    }],
  idContribType: [
    {
      type: String,
    }],
  idCity: [
    {
      type: Number,
    }],
  numLevel: {
    type: Number,
    default: 0,
  },
  adType: {
    type: Number,
  },
  photos: [
    {
      imagefile: {
        type: String,
      },
      alt: {
        type: String,
      },
      description: {
        type: String,
      },
    }],
  note: {
    type: String,
    default: '',
  },
  descr: {
    type: String,
  },
  date_created: {
    type: Date,
    default: Date.now,
  },
  date_updated: {
    type: Date,
    default: Date.now,
  },
});

MySkillSchema.pre('save', async function(next) {
  if (this.isNew) {
    const myrec = await MySkill.findOne().limit(1).sort({_id: -1});
    if (!!myrec) {
      if (myrec._doc._id === 0)
        this._id = 1;
      else
        this._id = myrec._doc._id + 1;

    } else {
      this._id = 1;
    }

    this.date_created = new Date();
  }

  next();
});

MySkillSchema.statics.findAllIdApp = async function(idapp) {
  const MySkill = this;

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

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

};

MySkillSchema.statics.getFieldsForSearch = function() {
  return [];
};

MySkillSchema.statics.getFieldsLastForSearch = function() {
  return [
    {field: 'note', type: tools.FieldType.string},
    {field: 'descr', type: tools.FieldType.string},
    {field: 'recSkill.descr', type: tools.FieldType.string},
    {field: 'myskill.descr', type: tools.FieldType.string},
  ];
};


MySkillSchema.statics.executeQueryTable = function(idapp, params) {
  params.fieldsearch = this.getFieldsForSearch();
  params.fieldsearch_last = this.getFieldsLastForSearch();

  const otherparams = {
    lookup1: {
      lk_tab: 'users',
      lk_LF: 'userId',
      lk_FF: '_id',
      lk_as: 'user',
      af_objId_tab: 'myId',
      lk_proj: {
        idSkill: 1,
        idSubSkill: 1,
        myskill: 1,
        idStatusSkill: 1,
        idContribType: 1,
        idCity: 1,
        numLevel: 1,
        adType: 1,
        photos: 1,
        note: 1,
        descr: 1,
        date_created: 1,
        date_updated: 1,
        userId: 1,
        username: 1,
        name: 1,
        surname: 1,
        'profile.img': 1,
        'profile.qualifica': 1,
      },
    },
  };

  params = {...params, ...otherparams};

  return tools.executeQueryTable(this, idapp, params);
};

MySkillSchema.statics.getMySkillByIdkill = function(idapp, idSkill) {
  const MySkill = this;

  const query = [
    {
      '$match': {
        '$and': [
          {
            '_id': parseInt(idSkill),
          },
        ],
      },
    },
    {
      '$match': {
        'idapp': idapp,
      },
    },
    {
      '$sort': {
        'desc': 1,
      },
    },
    {
      '$addFields': {
        'myId1': {
          '$toObjectId': '$userId',
        },
      },
    },
    {
      '$lookup': {
        'from': 'users',
        'localField': 'myId1',
        'foreignField': '_id',
        'as': 'user',
      },
    },
    {
      '$replaceRoot': {
        'newRoot': {
          '$mergeObjects': [
            {
              '$arrayElemAt': [
                '$user',
                0,
              ],
            },
            '$$ROOT',
          ],
        },
      },
    },
    {
      '$project': {
        'recSkill': 1,
        'sector': 1,
        'idSector': 1,
        'idSkill': 1,
        'idSubSkill': 1,
        'idStatusSkill': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        'photos': 1,
        'note': 1,
        'descr': 1,
        'date_created': 1,
        'date_updated': 1,
        'userId': 1,
        'username': 1,
        'name': 1,
        'surname': 1,
        'comune': 1,
        'mycities': 1,
        'profile.img': 1,
        'profile.qualifica': 1,
      },
    },
    {
      '$lookup': {
        'from': 'skills',
        'localField': 'idSkill',
        'foreignField': '_id',
        'as': 'recSkill',
      },
    },
    {
      '$replaceRoot': {
        'newRoot': {
          '$mergeObjects': [
            {
              '$arrayElemAt': [
                '$recSkill',
                0,
              ],
            },
            '$$ROOT',
          ],
        },
      },
    },
    {
      '$project': {
        'recSkill': 1,
        'sector': 1,
        'idSector': 1,
        'idSkill': 1,
        'idSubSkill': 1,
        'idStatusSkill': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        'photos': 1,
        'note': 1,
        'descr': 1,
        'date_created': 1,
        'date_updated': 1,
        'userId': 1,
        'username': 1,
        'name': 1,
        'surname': 1,
        'comune': 1,
        'mycities': 1,
        'profile.img': 1,
        'profile.qualifica': 1,
      },
    },
    {
      '$lookup': {
        'from': 'sectors',
        'localField': 'recSkill.idSector',
        'foreignField': '_id',
        'as': 'sector',
      },
    },
    {
      '$replaceRoot': {
        'newRoot': {
          '$mergeObjects': [
            {
              '$arrayElemAt': [
                '$sector',
                0,
              ],
            },
            '$$ROOT',
          ],
        },
      },
    },
    {
      '$project': {
        'recSkill': 1,
        'sector': 1,
        'idSector': 1,
        'idSkill': 1,
        'idSubSkill': 1,
        'idStatusSkill': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        'photos': 1,
        'note': 1,
        'descr': 1,
        'date_created': 1,
        'date_updated': 1,
        'userId': 1,
        'username': 1,
        'name': 1,
        'surname': 1,
        'comune': 1,
        'mycities': 1,
        'profile.img': 1,
        'profile.qualifica': 1,
      },
    },
    {
      '$lookup': {
        'from': 'subskills',
        'localField': 'idSubSkill',
        'foreignField': '_id',
        'as': 'myskill',
      },
    },
    {
      '$replaceRoot': {
        'newRoot': {
          '$mergeObjects': [
            {
              '$arrayElemAt': [
                '$myskill',
                0,
              ],
            },
            '$$ROOT',
          ],
        },
      },
    },
    {
      '$project': {
        'recSkill': 1,
        'sector': 1,
        'idSector': 1,
        'idSkill': 1,
        'idSubSkill': 1,
        'idStatusSkill': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        'photos': 1,
        'note': 1,
        'descr': 1,
        'date_created': 1,
        'date_updated': 1,
        'userId': 1,
        'username': 1,
        'name': 1,
        'surname': 1,
        'comune': 1,
        'mycities': 1,
        'profile.img': 1,
        'profile.qualifica': 1,
      },
    },
    {
      '$lookup': {
        'from': 'cities',
        'localField': 'idCity',
        'foreignField': '_id',
        'as': 'mycities',
      },
    },
    {
      '$replaceRoot': {
        'newRoot': {
          '$mergeObjects': [
            {
              '$arrayElemAt': [
                '$mycities',
                0,
              ],
            },
            '$$ROOT',
          ],
        },
      },
    },
    {
      '$project': {
        'recSkill': 1,
        'sector': 1,
        'idSector': 1,
        'idSkill': 1,
        'idSubSkill': 1,
        'idStatusSkill': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        'photos': 1,
        'note': 1,
        'descr': 1,
        'date_created': 1,
        'date_updated': 1,
        'userId': 1,
        'username': 1,
        'name': 1,
        'surname': 1,
        'comune': 1,
        'mycities': 1,
        'profile.img': 1,
        'profile.qualifica': 1,
      },
    },
  ];

  return MySkill.aggregate(query).then((rec) => {
    return rec ? rec[0] : null;
  });
};

MySkillSchema.statics.getCompleteRecord = function(idapp, id) {
  const MySkill = this;

  return MySkill.getMySkillByIdkill(idapp, id);

};


const MySkill = mongoose.model('MySkill', MySkillSchema);

module.exports = {MySkill};
