const _ = require('lodash');
require('dotenv').config({ path: __dirname + '../../.env' })
const { Blog } = require('../../models/admin/blog');
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.addEditBlog = async (req, res) => {
    const lang = req.headers["accept-language"] || 'en'
    if (_.has(req.body, ['id']) && (req.body.id) != null) {
        try {
            const setting = await Blog.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 Blog(_.pick(req.body,  ['title_en', 'title_ar', 'title_fr', 'description_en', 'description_ar', 'description_fr','blog_pic']));
        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.updateBlogById = async (req, res) => {
   
    const {id} = req.body
    let condition = {}
    condition['_id'] = (id);
    const lang = req.headers["accept-language"] || 'en'
    let record = await Blog.findOne(condition, { _id: 1 } );
    if (record) {
        await Blog.findOneAndUpdate(condition, { $set: req.body}, { new: true })
        return apiResponse(res, false,'',SUCCESS_MSG[`BLOG-UPDATED-${lang}`], SUCCESS.OK,req) 
    }

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

exports.blogListing = 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([
            Blog.find(filteredQuery).sort({ createdAt: -1 }).skip(page * limit).limit(limit),
            Blog.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.deleteBlog = async (req, res) => {
    
    try {
        const id = req.body.id;
        await Blog.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`], SERVER_ERROR.internalServerError, 0, [],req)
            }
        });
    } catch (err) {
        return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR`], SERVER_ERROR.internalServerError, 0, [],req)
    }
}

// delete selected blog
exports.deleteSelectedBlog = async (req, res) => {
   
    try {
        await Blog.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`], SERVER_ERROR.internalServerError, 0, [],req)
            }
        });
    } catch (err) {
        return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR`], SERVER_ERROR.internalServerError, 0, [],req)
    }
}

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

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

exports.changeBlogStatus = async (req, res) => {
    const {id, status} = req.body
   
    let condition = {}
    condition['_id'] =(id);

    let record = await Blog.findOne(condition, { _id: 1 } );
    if (record) {
        await Blog.findOneAndUpdate(condition, { $set: { is_active: status } }, { new: true })
        return apiResponse(res, false, [], '', SUCCESS.OK, 1, [],req) 
       
        
    }
    return  apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR`], CLIENT_ERROR.badRequest, 0,[],req);    
}