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

const express = require('express');
const router = express.Router();

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

var server_constants = require('../tools/server_constants');

var { Project } = require('../models/project');

var { authenticate, auth_default } = require('../middleware/authenticate');

const _ = require('lodash');

const Product = require('../models/product');
const Order = require('../models/order');
const Variant = require('../models/variant');

/*const Department = require('../models/Department')
const Category = require('../models/Category')
const TypedError = require('../modules/ErrorHandler')
const paypal_config = require('../configs/paypal-config')
const paypal = require('paypal-rest-sdk')
 */

const CartClass = require('../modules/Cart')
const Cart = require('../models/cart');
const OrdersCart = require('../models/orderscart');

//GET cart
router.get('/:userId', authenticate, function (req, res, next) {
  let userId = req.body.userId
  let idapp = req.body.idapp
  Cart.getCartByUserId(userId, idapp, function (err, cart) {
    if (err) return next(err)

    if (cart)
      res.send({ code: server_constants.RIS_CODE_OK, cart });
    else
      res.status(400).send(e);
  })
})

//POST cart
router.post('/:userId', authenticate, async function (req, res, next) {
  let idapp = req.body.idapp;
  let userId = req.params.userId;
  let addqty = req.body.addqty;
  let subqty = req.body.subqty;
  let order = req.body.order;

  const mycart = await Cart.getCartByUserId(userId, idapp);

  // const myorder = Order.getOrderByID(order._id);
  if (!addqty && !subqty)
    order._id = await Order.createOrder(order);

  let cart = null;
  // no cart save empty cart to database then return response
  let myqty = 0;
  if (!mycart) {
    let oldCart = new CartClass(order)
    cart = await Cart.createCart(oldCart.generateModel());
  } else {
    let newCart = CartClass.constructByCart(mycart);
    if (addqty) {
      myqty = await newCart.addqty(order);
    } else if (subqty) {
      myqty = await newCart.subqty(order);
    } else {
      const ind = newCart.addItem(order);
    }
    cart = await Cart.updateCartByCartId(mycart._id, newCart.generateModel());
  }
  if (cart) {
    const carttot = await Cart.getCartByUserId(userId, idapp);
    return res.send({ code: server_constants.RIS_CODE_OK, cart: carttot, qty: myqty });
  } else {
    return res.send({ code: server_constants.RIS_CODE_ERR, cart: null });
  }

  /*
      Cart.updateCartByUserId(
        userId,
        newCart,
        function (err, result) {
          if (err) return next(err)
          return res.status(200).json({ cart: result })
        })

   */
})

router.delete('/:userId', authenticate, async function (req, res) {
  console.log('DELETE Item');
  let idapp = req.query.idapp;
  let userId = req.params.userId;
  let orderId = req.query.orderId;

  const mycart = await Cart.getCartByUserId(userId, idapp);

  // Rimuovere l'Ordine
  const recremoved = await Order.findByIdAndRemove(orderId);
  if (recremoved) {
    // Rimuovere l'id sul Carrello

    let newCart = CartClass.constructByCart(mycart);
    newCart.removeItem(orderId);
    let carttot = null;
    const cart = await Cart.updateCartByCartId(mycart._id, newCart.generateModel());

    carttot = await Cart.getCartByUserId(userId, idapp);

    console.log('carttot', carttot)
    return res.send({ code: server_constants.RIS_CODE_OK, cart: carttot });
  }

  return res.send({ code: server_constants.RIS_CODE_ERR, cart: null });
});


//PUT cart
router.put('/:userId', authenticate, function (req, res, next) {
  let userId = req.params.userId
  let requestProduct = req.body
  let { productId, color, size } = requestProduct.product

  Cart.getCartByUserId(userId, function (err, c) {
    if (err) return next(err)
    let oldCart = new CartClass(c[0] || {})
    Product.getProductByID(productId, function (err, p) {
      if (err) return next(err)
      let newCart = oldCart.add(p, productId, { color, size })

      //exist cart in databse
      if (c.length > 0) {
        Cart.updateCartByUserId(
          userId,
          {
            items: newCart.items,
            totalQty: newCart.totalQty,
            totalPrice: newCart.totalPrice,
            userId: userId
          },
          function (err, result) {
            if (err) return next(err)
            res.json(result)
          })
      } else {
        //no cart in database
        newCart = new Cart({
          items: newCart.items,
          totalQty: newCart.totalQty,
          totalPrice: newCart.totalPrice,
          userId: userId
        })
        Cart.createCart(newCart, function (err, resultCart) {
          if (err) return next(err)
          res.status(201).json(resultCart)
        })
      }
    })
  })
})

//POST cart
router.post('/:userId/cartstatus', authenticate, async function (req, res, next) {
  let idapp = req.body.idapp;
  let userId = req.params.userId;
  let cart_id = req.body.cart_id;
  const user = req.user;
  let status = req.body.status;


  const mycart = await Cart.getCartByUserId(userId, idapp);
  const numorder = await OrdersCart.getNewNumOrder(userId, idapp);
  let statusOrderCart = await OrdersCart.getStatusCartByUserId(userId, idapp, numorder);

  try {
    if (!!mycart) {
      if (status === shared_consts.OrderStatus.CHECKOUT_SENT) {
        // Porta tutto il Cart nell'Ordine
        const newOrderCart = new OrdersCart({
          idapp,
          items: mycart.items,
          totalQty: mycart.totalQty,
          totalPrice: mycart.totalPrice,
          userId,
          status,
          note: mycart.note,
          numorder,
          created_at: new Date(),
          modify_at: new Date(),
        })
        return await OrdersCart.updateOrdersCartById(-1, newOrderCart, function (err, ris) {
          //if (err) return next(err)
          if (err)
            return res.send({ code: server_constants.RIS_CODE_ERR, status: 0 });
          else {
            const myris = ris;
            // Cancella il Cart appena salvato in OrdersCart

            return Cart.deleteCartByCartId(mycart.id)
              .then((ris) => {

                const orders = OrdersCart.getOrdersCartByUserId(userId, idapp, numorder)
                  .then((orders) => {
                    if (!!orders) {
                      sendemail.sendEmail_OrderProduct(user.lang, idapp, orders[0], user)
                        .then((ris) => {
                          return res.send({
                            code: server_constants.RIS_CODE_OK,
                            status: myris.status,
                            orders: orders
                          });
                        });
                    }
                  });
              })
          }
        })

        // mycart.numorder = await Cart.getNewNumOrder(userId, idapp);
        // mycart.status = shared_consts.OrderStatus.CHECKOUT_CONFIRMED
        /* const status = await Cart.findOneAndUpdate(
          { userId },
          {
            $set: {
              status: mycart.status, numorder: mycart.numorder
            }
          },
          { new: false })
          .then((rec) => {
            return rec.status
          }) */

      }

    }
    return res.send({ code: server_constants.RIS_CODE_OK, status: statusOrderCart });
  } catch (e) {
    return res.send({ code: server_constants.RIS_CODE_ERR, status: 0 });
  }


});

//POST cart
router.post('/:userId/orderstatus', authenticate, async function (req, res, next) {
  let idapp = req.body.idapp;
  let userId = req.params.userId;
  let order_id = req.body.order_id;
  const user = req.user;
  let status = req.body.status;

  const orderCart = await OrdersCart.find({ idapp, _id: order_id });

  if ((userId !== String(req.user._id)) && !User.isManager(req.user.perm)) {
    // I'm trying to write something not mine!
    return res.status(404).send({ code: server_constants.RIS_CODE_TODO_CREATING_NOTMYUSER });
  }

  try {
    if (!!orderCart) {

      let fields_to_update = { status };

      if (status === shared_consts.OrderStatus.RECEIVED) {
        fields_to_update = {
          status,
          completed_at: new Date()
        }
      }

      await OrdersCart.findOneAndUpdate({ _id: order_id }, { $set: fields_to_update }
        , { new: false })
        .then((ris) => {

          if (ris) {

            let ordertype = '';

            if (status === shared_consts.OrderStatus.ORDER_CONFIRMED) {
              ordertype = 'order_confirmed';
            } else if (status === shared_consts.OrderStatus.RECEIVED) {
              ordertype = 'order_completed';
            } else if (status === shared_consts.OrderStatus.CANCELED) {
              ordertype = 'order_canceled';
            }

            if (ordertype !== '') {
              sendemail.sendEmail_Order(user.lang, idapp, orderCart[0], user, ordertype)
                .then((ris) => {

                })
            }
          }

        })

      return res.send({ code: server_constants.RIS_CODE_OK, status });

    }
  } catch (e) {
    return res.send({ code: server_constants.RIS_CODE_ERR, status: 0 });
  }


});

module.exports = router;
