const { body, validationResult } = require('express-validator')
const TransactionDraft = require('../models/TransactionDraft')
const { VerityStockAreaId, PanatechStockAreaId } = require('../_env')
const { res404, res406, res500, checkValidations } = require('../plugins/controllersHelperFunctions')
const { notifyUser } = require('../WebSocket/controllers/user_EventsController')

module.exports.add_transaction_draft = [
  [
    body('db_name')
      .notEmpty()
      .withMessage('db param is required')
      .bail()
      .custom((value, { req }) => {
        if (value === 'verity' || value === 'panatech') return Promise.resolve()
        else return Promise.reject(new Error('incorrect db value'))
      })
  ],
  checkValidations(validationResult),
  (req, res) => {
    const { user_id } = req
    if (!user_id) return res404(res, 'invalid userID')
    const { db_name, description } = req.body
    const data = { user_id, db_name, description }

    const draft = new TransactionDraft(data)
    draft.save((err, data) => {
      if (err) return res500(res, err)
      notifyUser('updateDraftsCount', user_id)
      return res.json({ draftId: data._id })
    })
  }
]

module.exports.update_draft_description = [
  (req, res) => {
    const draftId = req.params?.draftId
    const { description } = req.body
    TransactionDraft.findByIdAndUpdate(draftId, { description }, (err, oldData) => {
      if (err || !oldData) return res404(res, err)
      else return res.json({ message: 'توضیحات فرم با موفقیت بروزرسانی شد' })
    })
  }
]

module.exports.get_user_drafts = [
  async (req, res) => {
    try {
      const { user_id } = req
      const drafts = await TransactionDraft.find({ user_id })
      return res.json(drafts)
    } catch (e) {
      return res.status(500).json({ message: e })
    }
  }
]

module.exports.get_one_user_draft = [
  (req, res) => {
    TransactionDraft.findById(req.params?.draftId, (err, data) => {
      if (err || !data) return res404(res, err)
      else return res.json(data)
    })
  }
]

module.exports.add_stuff_to_draft = [
  async (req, res) => {
    const userId = req.user_id
    const draftId = req.params?.draftId
    const { ItemID, ItemCode, MjQty, SerialNo1, GStartDate, GEndDate } = req.body

    try {
      // custom validations
      if (!Number(MjQty) || !Number.isInteger(Number(MjQty))) return res406(res, 'تعداد باید از جنس عدد صحیح باشد')

      if (!ItemID?.length || !ItemCode?.length) return res406(res, 'کالا را انتخاب کنید')

      if (Number(MjQty) < 1) return res406(res, 'تعداد نباید کمتر از 1 باشد')

      if (SerialNo1?.length && Number(MjQty) !== 1)
        return res406(res, 'تعداد کالاهایی که شماره سریال اختصاصی دارند نمیتواند بیشتر از یکی باشد')

      const draft = await TransactionDraft.findOne({ user_id: userId, _id: draftId })

      if (!draft) return res404(res, 'this transaction does not exist or not belongs to you')

      // check if item already exists
      for (let i = 0; i < draft.items.length; i++) {
        if ((await draft.items[i].SerialNo1) !== '') {
          if ((await draft.items[i].SerialNo1) === SerialNo1) return res406(res, 'این شماره سریال قبلا افزوده شده')
        } else {
          // eslint-disable-next-line no-lonely-if
          if ((await draft.items[i].ItemID) === ItemID) {
            draft.items[i].MjQty = Number(draft.items[i].MjQty) + Number(MjQty)
            draft.markModified('items')
            await draft.save()
            return res.json({ message: 'این کالا به تعداد کالای مشابه داخل لیست اضافه گردید' })
          }
        }
      }

      function stockAreaID(db) {
        if (db === 'verity') return VerityStockAreaId
        else if (db === 'panatech') return PanatechStockAreaId
        else return null
      }

      const item = {
        ItemID,
        ItemCode,
        MjQty: Number(MjQty),
        SerialNo1,
        GStartDate,
        GEndDate,
        StockAreaID: stockAreaID(draft.db_name),
        TransLineID: 'null',
        Price: 0,
        DiscountAmount: 0,
        DiscountPercent: 0,
        TaxAmount: 0,
        TollAmount: 0
      }

      draft.items.push(item)
      await draft.save()
      return res.json({ message: 'کالا با موفقیت به فرم افزوده شد' })
    } catch (e) {
      return res500(res, e)
    }
  }
]

module.exports.remove_stuff_from_draft = [
  async (req, res) => {
    const draftId = req.params?.draftId
    const { user_id } = req
    const { itemId, itemSerial } = req.body

    try {
      const draft = await TransactionDraft.findOne({ user_id, _id: draftId })
      if (!draft) return res404(res, 'this transaction does not exist or not belongs to you')
      draft.items = await draft.items.filter(item => {
        if (itemSerial === '') {
          return item.ItemID !== itemId
        } else {
          return item.SerialNo1 !== itemSerial
        }
      })
      draft.markModified('items')
      await draft.save()
      return res.json({ message: 'آیتم با موفقیت از لیست حذف شد' })
    } catch (e) {
      return res500(res, e)
    }
  }
]

module.exports.remove_draft = [
  (req, res) => {
    const draftId = req.params?.draftId

    TransactionDraft.findByIdAndDelete(draftId, (err, data) => {
      if (err || !data) return res404(res, err)
      notifyUser('updateDraftsCount', data.user_id)
      return res.json({ message: 'پیشنویس با موفقیت حذف شد' })
    })
  }
]
