export { };
const _ = require('lodash');
require('dotenv').config({ path: __dirname + '../.env' })
const { Category } = require("../../models/admin/category")
const mongoose = require("mongoose");
const { Admin } = require('../../models/admin/admin');
const { dateFormat } = require('../../core/utilities/commonService');
const { sendEmail } = require('../../core/utilities/emailService');
const { apiResponse } = require("../../core/response/response")
const { SUCCESS, REDIRECTION, CLIENT_ERROR, SERVER_ERROR } = require("../../core/response/statusCode")
const { ERROR_MSG, SUCCESS_MSG } = require("../../core/response/messages")
const { forgotPasswordTemplate } = require('../../core/email-templates/email-admin');
const adminUserObject = new Admin();
export { };

// //Add/Update Notes to login user
exports.categoryListing = async (req, res) => {

    let { title_en, createdAt, updatedAt, is_active, title_fr, title_ar } = req.body
    try {
        let filteredQuery = {}
        let category_title_en_regex = new RegExp(title_en, 'i');
        let category_title_ar_regex = new RegExp(title_ar, 'i');
        let category_title_fr_regex = new RegExp(title_fr, 'i');
        var createdDate = new Date(dateFormat(createdAt, 'yyyy-MM-dd'));
        var updatedDate = new Date(dateFormat(updatedAt, 'yyyy-MM-dd'));
        createdDate.setDate(createdDate.getDate() + 1)
        updatedDate.setDate(updatedDate.getDate() + 1)
        const filter_title_en = (title_en && title_en != 'undefined') ? { title_en: category_title_en_regex } : {};
        const filter_title_ar = (title_ar && title_ar != 'undefined') ? { title_ar: category_title_ar_regex } : {};
        const filter_title_fr = (title_fr && title_fr != 'undefined') ? { title_fr: category_title_fr_regex } : {};
        const filter_createdAt = (createdAt && createdAt != 'undefined') ? { createdAt: { $gte: new Date(dateFormat(createdAt, 'yyyy-MM-dd')), $lt: new Date(dateFormat(createdDate, 'yyyy-MM-dd')) } } : {};
        const filter_updatedAt = (updatedAt && updatedAt != 'undefined') ? { updatedAt: { $gte: new Date(dateFormat(updatedAt, 'yyyy-MM-dd')), $lt: new Date(dateFormat(updatedDate, 'yyyy-MM-dd')) } } : {};;
        filteredQuery = { ...filter_title_en, ...filter_title_ar, ...filter_title_fr, ...filter_createdAt, ...filter_updatedAt, is_deleted: false }
        if (is_active) {
            filteredQuery['is_active'] = is_active
        }
        if (is_active == false) {
            filteredQuery['is_active'] = is_active
        }
        filteredQuery['is_deleted'] = false
        let page = req.query.page ? parseInt(req.query.page) - 1 : 0;
        let limit = 10;
        let record = await Category.find(filteredQuery).sort({ createdAt: -1 }).skip(page * limit).limit(limit)
        let count = await Category.countDocuments(filteredQuery)
        if (record) {
            return apiResponse(res, false, [], '', SUCCESS.OK, count, record, req)
        }
    } catch (error) {
        return apiResponse(res, true, [], ERROR_MSG['SYSTEM-ERROR'], SERVER_ERROR.internalServerError, 0, [], req)
    }
}

// add category


exports.addCategory = async (req, res) => {
    let lang1 = 'en'
    if (_.has(req.body, ['id']) && (req.body.id) != null) {
        try {
            const setting = await Category.findOneAndUpdate({ _id: req.body.id }, { $set: req.body }, { new: true });
            return apiResponse(res, false, [], '', SUCCESS.OK, 0, [setting], req);
        } catch (err) {
            return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang1}`], SERVER_ERROR.internalServerError, 0, []);
        }

    }
    else {
        //setting
        var newcms = new Category(_.pick(req.body, ['title_en', 'title_ar', 'title_fr', 'image']));
        newcms.save()
            .then(function (record) {
                return apiResponse(res, false, [], '', SUCCESS.OK, 1, [record], req)
            })
            .catch(function (err) {
                return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang1}`], SERVER_ERROR.internalServerError, 0, [], req)
            });

    }
}

exports.changeCategoryStatus = async (req, res) => {
    let lang = 'en'
    const { id, status } = req.body
    let condition = {}
    condition['_id'] = new mongoose.Types.ObjectId(id);
    let record = await Category.findOne(condition, { _id: 1 });
    if (record) {
        await Category.findOneAndUpdate(condition, { $set: { is_active: status } }, { new: true })
        return apiResponse(res, false, [], '', SUCCESS.OK, 1, [record], req)
    }
    return apiResponse(res, true, [], ERROR_MSG[`NO-RECORD-FOUND-${lang}`], CLIENT_ERROR.badRequest, 0, [], req);
}


exports.deleteCategory = async (req, res) => {
    let lang = 'en'
    try {
        const { id } = req.body
        let condition = {}
        condition['_id'] = new mongoose.Types.ObjectId(id);

        let responseData = await Category.findOneAndUpdate(condition, { $set: { is_deleted: true } }, { new: true })
        if (responseData) {
            return apiResponse(res, false, [], '', SUCCESS.OK, 0, [], req);
        } else {
            return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang}`], SERVER_ERROR.internalServerError, 0, [], req)
        }

    }
    catch (err) {
        return apiResponse(res, true, [], ERROR_MSG['SYSTEM-ERROR'], SERVER_ERROR.internalServerError, 0, [], req)
    }
}


exports.deleteSelectedCategory = async (req, res) => {
    let lang = 'en'
    try {
        let responseData = await Category.updateMany(
            { _id: { $in: req.body.ids } }, { $set: { is_deleted: true, updatedAt: new Date() } }, { multi: true, upsert: true, new: true })
        if (responseData) {
            return apiResponse(res, false, [], '', SUCCESS.OK, 0, [], req);
        } else {
            return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang}`], SERVER_ERROR.internalServerError, 0, [], req)
        }

    }
    catch (err) {
        return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang}`], SERVER_ERROR.internalServerError, 0, [], req)
    }
}
