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

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

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

class Cart {
  constructor(order) {
    this.items = {};
    if (!!order) {
      this.idapp = order.idapp || 0;
      this.items[order._id] = order;
      this.userId = order.userId || "";
    }
    this.modify_at = new Date();

    this.updatetotals();
  }

  static constructByCart(cart) {
    try {
      const mynewcart = new Cart(null);
      mynewcart.idapp = cart.idapp || 0;
      mynewcart.items = cart.items;
      mynewcart.department = cart.department;
      mynewcart.userId = cart.userId || "";
      mynewcart.modify_at = new Date();

      return mynewcart;
    } catch (e) {
      console.log('Error', e);
      return null;
    }
  }

  async addqty(itemorder) {
    const myitem = this.items.find((rec) => rec.order._id.toString() === itemorder._id)
    if (!!myitem) {
      myitem.order.quantity++;
      await Order.findOneAndUpdate({ _id: myitem.order._id }, { $set: myitem.order }, { new: false });
      this.updatetotals();
      return myitem.order.quantity;
    }
  }

  async subqty(itemorder) {
    const myitem = this.items.find((rec) => rec.order._id.toString() === itemorder._id)
    if (!!myitem) {
      myitem.order.quantity--;
      await Order.findOneAndUpdate({ _id: myitem.order._id }, { $set: myitem.order }, { new: false });
      this.updatetotals();
      return myitem.order.quantity;
    }
  }


  addItem(itemorder) {
    // this.items.push(itemorder);
    let ind = this.items.length;
    this.items[ind] = {};
    this.items[ind].order = itemorder;
    this.updatetotals();

    return ind;
  }

  removeItem(orderId) {
    // this.items.push(itemorder);
    this.items = this.items.filter(item => item.order._id.toString() !== orderId.toString());
    this.updatetotals();
  }

  generateModel() {
    let newCart = new cartModel({
      idapp: this.idapp,
      items: this.generateArray(),
      totalQty: this.totalQty,
      totalPrice: this.totalPrice,
      userId: this.userId,
      department: this.department,
      note: this.note,
      modify_at: this.modify_at
    })
    return newCart
  }

  updatetotals() {
    this.totalQty = 0;
    this.totalPrice = 0;
    for (const rec in this.items) {
      let order = this.items[rec].order;
      if (!order) {
        order = this.items[rec];
      }
      this.totalQty += order.quantity;
      this.totalPrice += order.price * order.quantity;
    }

    this.totalPrice = parseFloat(this.totalPrice.toFixed(2))

  }

  generateArray() {
    let arr = [];
    for (let id in this.items) {
      arr.push(this.items[id])
    }
    return arr;
  }
}

module.exports = Cart
