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 MyHospSchema = new Schema({
  _id: {
    type: Number,
  },
  idapp: {
    type: String,
    required: true,
  },
  userId: {type: Schema.Types.ObjectId, ref: 'User'},
  typeHosp: {  // scambio casa / ospitalità
    type: Number,
  },
  numMaxPeopleHosp: {
    type: Number,
  },
  accomodation: [
    {
      type: {  // Letto matrimoniale / letto singolo / divano-letto / almaca / a terra sul tappeto (per sacco a pelo) / culla
        type: Number,
      },
      location: {  // in camera privata / in camera condivisa / in soggiorno / in camper / in tenda / in giardino / all'aperto
        type: Number,
      },
      num: {
        type: Number,
      },
    }],
  preferences: [  // Accetto bambini, Accetto cani, Accetto gatti, E' consentito fumare in casa, Accessibile con sedia a rotelle
    {
      type: Number,
    }],
  photos: [
    {
      imagefile: {
        type: String,
      },
      alt: {
        type: String,
      },
      description: {
        type: String,
      },
    }],
  idContribType: [
    {
      type: String,
    }],
  idCity: [
    {
      type: Number,
    }],
  descr: {
    type: String,
  },
  note: {
    type: String,
    default: '',
  },
  website: {
    type: String,
  },
  link_maplocation: {
    type: String,
  },
  date_created: {
    type: Date,
    default: Date.now,
  },
  date_updated: {
    type: Date,
    default: Date.now,
  },
});

MyHospSchema.pre('save', async function(next) {
  if (this.isNew) {
    const myrec = await MyHosp.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();
});

MyHospSchema.statics.findAllIdApp = async function(idapp) {
  const MyHosp = this;

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

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

};

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

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

MyHospSchema.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: {
        typeHosp: 1,
        numMaxPeopleHosp: 1,
        accomodation: 1,
        preferences: 1,
        photos: 1,
        idContribType: 1,
        idCity: 1,
        note: 1,
        website: 1,
        link_maplocation: 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);
};

MyHospSchema.statics.getMyRecById = function(idapp, id) {
  const MyHosp = this;

  const query = [
    {
      '$match': {
        '$and': [
          {
            '_id': parseInt(id),
          },
        ],
      },
    },
    {
      '$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': {
        typeHosp: 1,
        numMaxPeopleHosp: 1,
        accomodation: 1,
        preferences: 1,
        photos: 1,
        idContribType: 1,
        idCity: 1,
        note: 1,
        website: 1,
        link_maplocation: 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': {
        typeHosp: 1,
        numMaxPeopleHosp: 1,
        accomodation: 1,
        preferences: 1,
        photos: 1,
        idContribType: 1,
        idCity: 1,
        note: 1,
        website: 1,
        link_maplocation: 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': {
        typeHosp: 1,
        numMaxPeopleHosp: 1,
        accomodation: 1,
        preferences: 1,
        photos: 1,
        idContribType: 1,
        idCity: 1,
        note: 1,
        website: 1,
        link_maplocation: 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': 'MyHosp',
      },
    },*/
    {
      '$replaceRoot': {
        'newRoot': {
          '$mergeObjects': [
            {
              '$arrayElemAt': [
                '$MyHosp',
                0,
              ],
            },
            '$$ROOT',
          ],
        },
      },
    },
    {
      '$project': {
        typeHosp: 1,
        numMaxPeopleHosp: 1,
        accomodation: 1,
        preferences: 1,
        photos: 1,
        idContribType: 1,
        idCity: 1,
        note: 1,
        website: 1,
        link_maplocation: 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': {
        typeHosp: 1,
        numMaxPeopleHosp: 1,
        accomodation: 1,
        preferences: 1,
        photos: 1,
        idContribType: 1,
        idCity: 1,
        note: 1,
        website: 1,
        link_maplocation: 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 MyHosp.aggregate(query).then((rec) => {
    return rec ? rec[0] : null;
  });
};

MyHospSchema.statics.getCompleteRecord = function(idapp, id) {
  const MyHosp = this;

  return MyHosp.getMyRecById(idapp, id);

};

const MyHosp = mongoose.model('MyHosp', MyHospSchema);

module.exports = {MyHosp};
