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

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

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

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


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

const orderSchema = new Schema({
  idapp: {
    type: String,
  },
  userId: {
    type: String,
  },
  status: {
    type: Number,
  },
  idProduct: {
    type: String
  },
  idProducer: {
    type: String
  },
  idStorehouse: {
    type: String
  },
  price: {
    type: Number
  },
  after_price: {
    type: String
  },
  color: {
    type: String
  },
  size: {
    type: String
  },
  quantity: {
    type: Number
  },
  weight: {
    type: Number
  },
  stars: {
    type: Number
  },
  date_created: {
    type: Date
  },
  date_checkout: {
    type: Date
  },
  date_payment: {
    type: Date
  },
  date_shipping: {
    type: Date
  },
  date_delivered: {
    type: Date
  },
  notes: {
    type: String
  }
});

var Order = module.exports = mongoose.model('Order', orderSchema);

module.exports.getFieldsForSearch = function () {
  return []
};

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

module.exports.findAllIdApp = async function (idapp) {

  const query = [
    { $match: { idapp } },
    { "$addFields": { "myidProd": { "$toObjectId": "$idProduct" } } },
    { "$addFields": { "myidProducer": { "$toObjectId": "$idProducer" } } },
    {
      $lookup: {
        from: 'products',
        localField: 'myidProd',
        foreignField: '_id',
        as: 'product'
      }
    },
    {
      $lookup: {
        from: 'producers',
        localField: 'myidProducer',
        foreignField: '_id',
        as: 'producer'
      }
    },
    { $unwind: '$product' },
    { $unwind: '$producer' },
  ];

  return await Order.aggregate(query)

};

module.exports.getAllOrders = function (query, sort, callback) {
  Order.find(query, null, sort, callback)
}

module.exports.getOrderByUserId = function (userId, sort, callback) {
  Order.find({ userId }, null, sort, callback)
}


module.exports.getOrderByID = function (id, callback) {
  Order.findById(id, callback);
}

module.exports.createOrder = async function (order) {
  const orderModel = new Order(order);

  return await orderModel.save(order)
    .then((ris) => {
      if (!!ris)
        return ris._id;
      return null;
    });
}

module.exports.getTotalOrderById = async function (id) {
  const query = [
    { $match: { _id: ObjectID(id) } },
    { "$addFields": { "myidProd": { "$toObjectId": "$idProduct" } } },
    { "$addFields": { "myidProducer": { "$toObjectId": "$idProducer" } } },
    { "$addFields": { "myidStore": { "$toObjectId": "$idStorehouse" } } },
    {
      $lookup: {
        from: 'products',
        localField: 'myidProd',
        foreignField: '_id',
        as: 'product'
      }
    },
    {
      $lookup: {
        from: 'producers',
        localField: 'myidProducer',
        foreignField: '_id',
        as: 'producer'
      }
    },
    {
      $lookup: {
        from: 'storehouses',
        localField: 'myidStore',
        foreignField: '_id',
        as: 'storehouse'
      }
    },
    { $unwind: '$product' },
    { $unwind: '$producer' },
    { $unwind: '$storehouse' },
  ];

  return await Order.aggregate(query);
}



// const Order = mongoose.model('Order', OrderSchema);

// module.exports = { Order };
