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

const shared_consts = require('../tools/shared_nodejs');

const Order = require('../models/order');

const CartSchema = new Schema({
  idapp: {
    type: String,
  },
  userId: {type: Schema.Types.ObjectId, ref: 'User'},
  totalQty: {type: Number, default: 0},
  totalPrice: {type: Number, default: 0},
  department: {
    type: String, ref: 'Department',
  },
  items: [
    {
      order:
          {type: Schema.Types.ObjectId, ref: 'Order'},
    },
  ],
  note: {
    type: String,
  },
  modify_at: {
    type: Date,
  },
});

var Cart = module.exports = mongoose.model('Cart', CartSchema);

module.exports.findAllIdApp = async function(idapp, userId) {
  const myfind = {idapp, userId};

  return await Cart.findOne(myfind).lean();
};

module.exports.getCartByUserId = async function(uid, idapp) {
  let query = {userId: uid, idapp};
  const mycart = await Cart.findOne(query).lean();

  if (!!mycart) {
    for (const idkey in mycart.items) {
      try {
        idorder = mycart.items[idkey]._id.toString();
        const myorder = mycart.items[idkey].order;
        if (!!myorder) {
          idorder = mycart.items[idkey].order._id.toString();
        }
        const myord = await Order.getTotalOrderById(idorder);
        if (myord.length > 0) {
          mycart.items[idkey].order = myord[0];
        }
      } catch (e) {
        console.log('err', e);
      }
    }
    return mycart;
  }
  return null;

};

module.exports.updateCartByUserId = function(userId, newCart, callback) {
  let query = {userId: userId};
  Cart.find(query, function(err, c) {
    if (err) throw err;

    //exist cart in databse
    if (c.length > 0) {
      Cart.findOneAndUpdate(
          {userId: userId},
          {
            $set: {
              items: newCart.items,
              totalQty: newCart.totalQty,
              totalPrice: newCart.totalPrice,
              userId: userId,
            },
          },
          {new: true},
          callback,
      );
    } else {
      //no cart in database
      newCart.save(callback);
    }
  });
};

module.exports.updateCartByCartId = async function(cartId, newCart) {
  // delete newCart._doc._id;
  const items = newCart.items;
  const totalQty = newCart.totalQty;
  const totalPrice = newCart.totalPrice;

  const modify_at = new Date();

  return await Cart.findOneAndUpdate({_id: cartId}, {
    $set: {
      items,
      totalPrice,
      totalQty,
      modify_at,
    },
  }, {new: false}).lean().then((ris) => {
    return ris;
  }).catch(err => {
    console.log('err', err);
    return null;
  });

};

module.exports.deleteCartByCartId = async function(cartId) {
  return await Cart.remove({_id: cartId});
};

module.exports.createCart = async function(newCart) {
  return await newCart.save();
};

