const _ = require('lodash');
const { FAQ } = require('../../models/admin/faq');
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 {dateFormat} = require('../../core/utilities/commonService');
const mongoose = require("mongoose");

export {}

exports.faqAdd = async (req, res) => {
    let lang1 = 'en';
    // If no validation errors, get the req.body objects that were validated and are needed
    const { id, question_en, answer_en, question_ar, answer_ar, question_fr, answer_fr, is_active, is_priority } = req.body
    if (_.has(req.body, ['id']) && (req.body.id) != null) {

        let condition = {};
        condition['_id'] = id;

        //checking record exist
        let record = await FAQ.findOne(condition, { _id: 1 });
        if (!record) {
            return apiResponse(res, true, [], ERROR_MSG[`NO-RECORD-FOUND-${lang1}`], SERVER_ERROR.internalServerError, 0, [], req);
        }
        //update FAQ
        const updateFaq = await FAQ.findOneAndUpdate({ _id: new mongoose.Types.ObjectId(req.body.id) }, { $set: req.body }, { new: true });
        return apiResponse(res, false, [], '', SUCCESS.OK, 0, [updateFaq], req);
    } else {
        //save FAQ 
        var newFAQ = new FAQ(_.pick(req.body, ['question_en', 'answer_en', 'question_ar', 'answer_ar', 'question_fr', 'answer_fr', 'is_active', 'is_priority', 'createdAt', 'updatedAt','user_type']));

        newFAQ.save()
            .then(record => {
                return apiResponse(res, false, [], '', SUCCESS.OK, 1, [record], req);
            })
            .catch(err => {
                return apiResponse(res, true, [], ERROR_MSG['SYSTEM-ERROR'], SERVER_ERROR.internalServerError, 0, []);
            });
    }
    
}

exports.faqListing = async (req, res) => {
    var title_lang = 'en'
    try {
        const {questionRemoveTagEnglish, answerRemoveTagEnglish, questionRemoveTagArabic, answerRemoveTagArabic, questionRemoveTagFrench, answerRemoveTagFrench, is_active, created, updated,user_type } = req.body
        var filteredQuery = {}
        let page, limit:number;
        let ques_en_regex = new RegExp(questionRemoveTagEnglish,'i');
        let ans_en_regex = new RegExp(answerRemoveTagEnglish,'i');
        let ques_ar_regex = new RegExp(questionRemoveTagArabic,'i');
        let ans_ar_regex = new RegExp(answerRemoveTagArabic,'i');
        let ques_fr_regex = new RegExp(questionRemoveTagFrench,'i');
        let ans_fr_regex = new RegExp(answerRemoveTagFrench,'i');
        if(req.query.search){
            var createdDate = new Date(dateFormat(created, 'yyyy-MM-dd'));
            var updatedDate = new Date(dateFormat(updated, '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_ques_en = (questionRemoveTagEnglish && questionRemoveTagEnglish != 'undefined')  ? { question_en: ques_en_regex } : {};
            const filter_ans_en = (answerRemoveTagEnglish && answerRemoveTagEnglish != 'undefined') ? { answer_en: ans_en_regex } : {};
            const filter_ques_ar = (questionRemoveTagArabic && questionRemoveTagArabic != 'undefined')  ? { question_ar: ques_ar_regex } : {};
            const filter_ans_ar = (answerRemoveTagArabic && answerRemoveTagArabic != 'undefined') ? { answer_ar: ans_ar_regex } : {};
            const filter_ques_fr = (questionRemoveTagFrench && questionRemoveTagFrench != 'undefined')  ? { question_fr: ques_fr_regex } : {};
            const filter_ans_fr = (answerRemoveTagFrench && answerRemoveTagFrench != 'undefined') ? { answer_fr: ans_fr_regex } : {};
            const filter_createdAt = (created && created != 'undefined') ? { createdAt: {$gte: new Date(dateFormat(created, 'yyyy-MM-dd')), $lt:  new Date(dateFormat(createdDate, 'yyyy-MM-dd'))} } : {};
            const filter_updatedAt = (updated && updated != 'undefined') ? { updatedAt: {$gte: new Date(dateFormat(updated, 'yyyy-MM-dd')), $lt:  new Date(dateFormat(updatedDate, 'yyyy-MM-dd'))} } : {};
            filteredQuery = { ...filter_ques_en, ...filter_ans_en, ...filter_ques_ar, ...filter_ans_ar, ...filter_ques_fr, ...filter_ans_fr, ...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'] = false
        }
        if(user_type){
            filteredQuery['user_type'] = user_type
        }

        const [data, count] = await Promise.all([
            FAQ.find(filteredQuery).sort({createdAt: -1}).skip(page * limit).limit(limit),
            FAQ.countDocuments(filteredQuery)
        ]);
        return apiResponse(res, false, [], '', SUCCESS.OK, count, data, req)  

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

// delete faq
exports.deleteFAQ = async (req, res) => {

    let lang = 'en'
    try {
        const id = req.body.id;
        let cres = await FAQ.findOneAndUpdate({ _id: new mongoose.Types.ObjectId(id) }, { $set: { is_deleted: true } }, { new: true })
        if (cres) {
            return apiResponse(res, false, [], '', SUCCESS.OK, 0, [cres], 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, [])
    } 
}

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

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

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

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