const _ = require('lodash');
require('dotenv').config({ path: __dirname + '../../.env' })
const { Magazine } = require('../../models/admin/magazine');
const { MagazineCategory } = require('../../models/admin/magazine_category');
const { User } = require('../../models/user');
const { dateFormat } = require('../../core/utilities/commonService');
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 { CronEmail } = require('../../models/email')
const { sendEmail } = require('../../core/utilities/emailService');
// const { allUsersNotifiyToNewBlogTemplate} = require('../../core/utilities/emailTemplates');
const userObject = new User();
export { };
//add blog
exports.addEditMagazine = async (req, res) => {
    const lang = req.headers["accept-language"] || 'en'
    if (_.has(req.body, ['id']) && (req.body.id) != null) {
        try {
            const setting = await Magazine.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-${lang}`], SERVER_ERROR.internalServerError, 0, [], req);
        }

    }
    else {
        //setting
        var newcms = new Magazine(_.pick(req.body, ['title_en', 'title_ar', 'magazine_pic', 'magazine_pdf', 'magazine_video', 'title_fr', 'description_en', 'description_ar', 'description_fr', 'magazine_category']));
        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-${lang}`], SERVER_ERROR.internalServerError, 0, [], req)
            });

    }
}



exports.updateMagazineById = async (req, res) => {

    const { id } = req.body
    let condition = {}
    condition['_id'] = (id);
    const lang = req.headers["accept-language"] || 'en'
    let record = await Magazine.findOne(condition, { _id: 1 });
    if (record) {
        await Magazine.findOneAndUpdate(condition, { $set: req.body }, { new: true })
        return apiResponse(res, false, '', [], SUCCESS.OK, req)
    }

    return apiResponse(res, true, [], ERROR_MSG[`NO-RECORD-FOUND-${lang}`], CLIENT_ERROR.badRequest, 0, [], req);

}

exports.magazineListing = async (req, res) => {
    const lang = req.headers["accept-language"] || 'en'
    try {
        const { title, removeTagDesc, createdAt, is_active, updatedAt } = req.body
        var filteredQuery = {}
        let page, limit: number;
        let title_regex = new RegExp(title, 'i');
        let description_regex = new RegExp(removeTagDesc, 'i');

        if (req.query.search) {
            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)
            page = req.query.page ? parseInt(req.query.page) - 1 : 0;
            limit = 10;
            const filter_title = (title && title != 'undefined') ? { title: title_regex } : {};
            const filter_description = (removeTagDesc && removeTagDesc != 'undefined') ? { description: description_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, ...filter_description, ...filter_createdAt, ...filter_updatedAt, is_deleted: false }
        } else {
            page = req.query.page ? parseInt(req.query.page) - 1 : 0;
            limit = 10;
            filteredQuery = {
                is_deleted: false
            }
        }
        if (is_active) {
            filteredQuery['is_active'] = is_active
        }
        if (is_active == false) {
            filteredQuery['is_active'] = is_active
        }
        const [data, count] = await Promise.all([
            Magazine.find(filteredQuery).sort({ createdAt: -1 }).skip(page * limit).limit(limit),
            Magazine.countDocuments(filteredQuery)
        ]);
        return apiResponse(res, false, [], '', SUCCESS.OK, count, data, req)
    } catch (error) {
        return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang}`], SERVER_ERROR.internalServerError, 0, [], req)
    }
}

// delete blog
exports.deleteMagazine = async (req, res) => {
    const lang = req.headers["accept-language"] || 'en'
    try {
        const id = req.body.id;
        await Magazine.findOneAndUpdate({ _id: id }, { $set: { is_deleted: true, updatedAt: new Date() } }, { upsert: true, new: true }).then(cres => {
            if (cres) {
                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)
    }
}

// delete selected blog
exports.deleteSelectedMagazine = async (req, res) => {
    const lang = req.headers["accept-language"] || 'en'
    try {
        await Magazine.updateMany({ _id: { $in: req.body.id } }, { $set: { is_deleted: true, updatedAt: new Date() } }, { multi: true, upsert: true, new: true }).then(cres => {
            if (cres) {
                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)
    }
}

exports.listingMagazineById = async (req, res) => {
    const lang = req.headers["accept-language"] || 'en'
    try {
        const { id } = req.body

        let condition = {}
        condition['_id'] = (id);
        condition['is_deleted'] = false;
        const [data, count] = await Promise.all([
            Magazine.find(condition).sort({ createdAt: -1 }),
            //Property.find({is_deleted:false}).sort({createdAt: -1}).skip(page * limit).limit(limit),
            Magazine.countDocuments(condition)
        ]);
        return apiResponse(res, false, [], '', SUCCESS.OK, count, data, req)

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

exports.changeMagazineStatus = async (req, res) => {
    const { id, status } = req.body
    const lang = req.headers["accept-language"] || 'en'
    let condition = {}
    condition['_id'] = (id);

    let record = await Magazine.findOne(condition, { _id: 1 });
    if (record) {
        await Magazine.findOneAndUpdate(condition, { $set: { is_active: status } }, { new: true })
        return apiResponse(res, false, [], '', SUCCESS.OK, 1, [], req)


    }
    return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang}`], CLIENT_ERROR.badRequest, 0, [], req);
}


// magazine category list
exports.MagazineCategoryList = async (req, res) => {

    const { id } = req.body
   
    const lang = req.headers["accept-language"] || 'en'
    let record = await MagazineCategory.find({});
    let count = await MagazineCategory.countDocuments({})
    if (record) {
        
        return apiResponse(res, false, [], '', SUCCESS.OK, count, record, req)
    }

    return apiResponse(res, true, [], ERROR_MSG[`NO-RECORD-FOUND-${lang}`], CLIENT_ERROR.badRequest, 0, [], req);

}
