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 MyGoodSchema = new Schema({
  _id: {
    type: Number,
  },
  idapp: {
    type: String,
    required: true,
  },
  userId: {type: Schema.Types.ObjectId, ref: 'User'},
  idSectorGood: {
    type: Number,
  },
  idGood: {
    type: Number,
    default: 0,
  },
  idShipping: [
    {
      type: Number,
    }],

  idContribType: [
    {
      type: String,
    }],
  idCity: [
    {
      type: Number,
    }],
  numLevel: {
    type: Number,
    default: 0,
  },
  adType: {
    type: Number,
  },
  otherfilters: [{
    type: Number,
  }],
  photos: [
    {
      imagefile: {
        type: String,
      },
      alt: {
        type: String,
      },
      description: {
        type: String,
      },
    }],
  note: {
    type: String,
    default: '',
  },
  descr: {
    type: String,
  },
  //**ADDFIELD_MyGood
  website: {
    type: String,
  },
  date_created: {
    type: Date,
    default: Date.now,
  },
  date_updated: {
    type: Date,
    default: Date.now,
  },
});

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

MyGoodSchema.statics.findAllIdApp = async function(idapp) {
  const MyGood = this;

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

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

};

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

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


MyGoodSchema.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: {
        idGood: 1,
        idShipping: 1,
        MyGood: 1,
        idStatusGood: 1,
        idContribType: 1,
        idCity: 1,
        numLevel: 1,
        adType: 1,
        otherfilters: 1,
        photos: 1,
        note: 1,
        website: 1,
        //**ADDFIELD_MyGood
        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);
};

MyGoodSchema.statics.getMyRecById = function(idapp, idGood) {
  const MyGood = this;

  const query = [
    {
      '$match': {
        '$and': [
          {
            '_id': parseInt(idGood),
          },
        ],
      },
    },
    {
      '$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': {
        'recGood': 1,
        'sectorgood': 1,
        'idSectorGood': 1,
        'idGood': 1,
        'idShipping': 1,
        'idStatusGood': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        otherfilters: 1,
        'photos': 1,
        note: 1,
        website: 1,
        //**ADDFIELD_MyGood
        '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': 'goods',
        'localField': 'idGood',
        'foreignField': '_id',
        'as': 'recGood',
      },
    },
    {
      '$replaceRoot': {
        'newRoot': {
          '$mergeObjects': [
            {
              '$arrayElemAt': [
                '$recGood',
                0,
              ],
            },
            '$$ROOT',
          ],
        },
      },
    },
    {
      '$project': {
        'recGood': 1,
        'sectorgood': 1,
        'idSectorGood': 1,
        'idGood': 1,
        'idShipping': 1,
        'idStatusGood': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        otherfilters: 1,
        'photos': 1,
        'note': 1,
        website: 1,
        //**ADDFIELD_MyGood
        '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': 'sectorgoods',
        'localField': 'recGood.idSectorGood',
        'foreignField': '_id',
        'as': 'sectorgood',
      },
    },
    {
      '$replaceRoot': {
        'newRoot': {
          '$mergeObjects': [
            {
              '$arrayElemAt': [
                '$sectorgood',
                0,
              ],
            },
            '$$ROOT',
          ],
        },
      },
    },
    {
      '$project': {
        'recGood': 1,
        'sectorgood': 1,
        'idSectorGood': 1,
        'idGood': 1,
        'idShipping': 1,
        'idStatusGood': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        otherfilters: 1,
        'photos': 1,
        'note': 1,
        website: 1,
        //**ADDFIELD_MyGood
        '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': 'subgoods',
        'localField': 'idShipping',
        'foreignField': '_id',
        'as': 'MyGood',
      },
    },
    {
      '$replaceRoot': {
        'newRoot': {
          '$mergeObjects': [
            {
              '$arrayElemAt': [
                '$MyGood',
                0,
              ],
            },
            '$$ROOT',
          ],
        },
      },
    },
    {
      '$project': {
        'recGood': 1,
        'sectorgood': 1,
        'idSectorGood': 1,
        'idGood': 1,
        'idShipping': 1,
        'idStatusGood': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        otherfilters: 1,
        'photos': 1,
        'note': 1,
        website: 1,
        //**ADDFIELD_MyGood
        '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': {
        'recGood': 1,
        'sectorgood': 1,
        'idSectorGood': 1,
        'idGood': 1,
        'idShipping': 1,
        'idStatusGood': 1,
        'idContribType': 1,
        'idCity': 1,
        'numLevel': 1,
        adType: 1,
        otherfilters: 1,
        'photos': 1,
        'note': 1,
        website: 1,
        //**ADDFIELD_MyGood
        '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 MyGood.aggregate(query).then((rec) => {
    return rec ? rec[0] : null;
  });
};

MyGoodSchema.statics.getCompleteRecord = function(idapp, id) {
  const MyGood = this;

  return MyGood.getMyRecById(idapp, id);

};


const MyGood = mongoose.model('MyGood', MyGoodSchema);

module.exports = {MyGood};
