export { };
const _ = require('lodash');
require('dotenv').config({ path: __dirname + '../.env' })
const mongoose = require("mongoose");
const { Language } = require("../../models/admin/language")
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 { LanguageTranslate } = require("../../models/admin/language-translate");

//Listing Languages
exports.lanuageListing = async (req, res) => {

    const { title, createdAt, updatedAt, is_active } = req.body
    try {
        let filteredQuery = {}
        let title = new RegExp(req.body.title, '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 = (req.body.title && req.body.title != 'undefined') ? { title: title } : {};
       
        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_createdAt, ...filter_updatedAt, is_deleted: false }
        if(is_active==true || 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 Language.find(filteredQuery).sort({ createdAt: -1 }).skip(page * limit).limit(limit)
        let count = await Language.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/Edit Language
exports.addEditLanguage = async (req, res) => {
    let lang1 = 'en'
    if (_.has(req.body, ['id']) && (req.body.id) != null) {
        try {
            const setting = await Language.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 Language(_.pick(req.body, ['title']));
        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.changeLanguageStatus = async (req, res) => {
    let lang = 'en'
    const { id, status } = req.body
    let condition = {}
    condition['_id'] = new mongoose.Types.ObjectId(id);
    let record = await Language.findOne(condition, { _id: 1 });
    if (record) {
        await Language.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.deleteLanguage = async (req, res) => {
    let lang = 'en'
    try {
        const { id } = req.body
        let condition = {}
        condition['_id'] = new mongoose.Types.ObjectId(id);

        let responseData = await Language.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.deleteSelectedLanguage = async (req, res) => {
    let lang = 'en'
    try {
        let responseData = await Language.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)
    }
}

exports.setTranslateLanguageStatus = async ( req , res ) => 
{
    const lang = req.headers["accept-language"] || 'en'
    try {
        const {id , status } = req.body;
        let responseData = await LanguageTranslate.findOneAndUpdate({ _id : id } , { is_active : status } ,{ 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)
    }
}

exports.addTranslateLanguage = async ( req , res ) => 
{
    const lang = req.headers["accept-language"] || 'en'
    try {
        const {name ,  language_type , } = req.body;
        let responseData = await LanguageTranslate.create( { name , lang_type : language_type });
        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)
    }
}

exports.getTranslateLanguage = async (req, res) => {
    const lang = req.headers["accept-language"] || 'en'
    try {
        const { is_active } = req.body;
        const filteredQuery = {is_deleted: false};
        if(is_active == false  || is_active == true )
        {
            filteredQuery['is_active']=is_active
        }
        const [data, count] = await Promise.all([
            LanguageTranslate.find(filteredQuery),
            LanguageTranslate.countDocuments({is_deleted: false, is_active: true})
        ]);
        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)
    }
}
