require('dotenv').config();
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 mongoose = require("mongoose");
const { Medicine} = require("../../models/medicines");
export {};


exports.addMultipleMedicines = async ( req  ,res ) => 
{
    try
    {
        const { medicines} = req.body;
       
        const lang = req.headers["accept-language"] || 'en';
        let resp = await Medicine.insertMany(medicines);
        console.log("---- api resp ----" , resp)
        return apiResponse(res, false, [], '', SUCCESS.OK, 0, [],req); 
    }
    catch(error)
    {
        console.log(error);
        return apiResponse(res, true, [], ERROR_MSG['SYSTEM-ERROR'], SERVER_ERROR.internalServerError, 0, [])
    }
}

exports.addEditMedicine = async ( req  ,res ) => 
{
    try
    {
        const lang = req.headers["accept-language"] || 'en';
        const { id ,  registration_no , registration_year , ingredients , category , name } = req.body;
        if(!registration_no || !registration_year  || !ingredients || !category || !name )
        {
            return apiResponse(res, true, [], "All fields are required !", CLIENT_ERROR.badRequest, 0, [])
        }
        let details:any;
        if(!id)
        {
             details = await Medicine.create({registration_no , registration_year : new Date(registration_year) , ingredients , category , name});
        }
        else
        {
             details = await Medicine.findByIdAndUpdate({_id : id , is_deleted : false } ,{registration_no , registration_year :new Date(registration_year) , ingredients , category , name} , { new : true});
        }

        return apiResponse(res, false, [], '', SUCCESS.OK, 0, details,req); 
    }
    catch(error)
    {
        console.log(error);
        return apiResponse(res, true, [], ERROR_MSG['SYSTEM-ERROR'], SERVER_ERROR.internalServerError, 0, [])
    }
}

exports.medicineList = async ( req , res ) => 
{
    try 
    {
        const {page = 1 , limit = 10 , name , category , registration_year , resgistration_no } = req.body;

        let skip = (page-1) * limit;
        const filteredQuery={ is_deleted : false , is_active : true };
        name!="" && name != undefined ? filteredQuery['name'] = { $regex : new RegExp( name,"i")} : "";
        category!="" && category != undefined ? filteredQuery['category'] = { $regex : new RegExp( category,"i")} : "";
        resgistration_no!="" && resgistration_no != undefined ? filteredQuery['category'] = { $regex : new RegExp( category,"i")} : "";
        if(registration_year)
        {
            let startDate = new Date(registration_year);
            startDate.setUTCHours(0,0,0);
            let endDate = new Date(registration_year);
            endDate.setUTCHours(23,59,59);

            filteredQuery['registration_year'] = { $gte : startDate  , $lte : endDate};
        }

        const [records , count] = await Promise.all([
            Medicine.aggregate([
                {
                    $match : filteredQuery
                },
                {
                    $sort : { createdAt : -1}
                },
                {
                    $skip : skip
                },
                {
                    $limit : limit
                },
            ]),
            Medicine.countDocuments(filteredQuery)
        ])
         return apiResponse(res, false, [], '', SUCCESS.OK, count, records,req); 
    }
    catch(error)
    {
        console.log(error);
        return apiResponse(res, true, [], ERROR_MSG['SYSTEM-ERROR'], SERVER_ERROR.internalServerError, 0, [])
    }
}

exports.deleteMedicine = async ( req , res ) => 
{
    try
    {
        const { id } = req.params;
        await Medicine.findByIdAndUpdate({_id : id } , { is_deleted : true , is_active : false });

        return apiResponse(res, false, [], '', SUCCESS.OK, 0, [],req); 
    }
    catch(error)
    {
        console.log(error);
        return apiResponse(res, true, [], ERROR_MSG['SYSTEM-ERROR'], SERVER_ERROR.internalServerError, 0, [])
    }
}

exports.toggleMedicineStatus = async ( req , res ) => 
{
    try 
    {
        const { id , status } = req.body;
        const updatedMed = await Medicine.findByIdAndUpdate({_id : id } , { is_active : status} , { new : true });
        return apiResponse(res, false, [], '', SUCCESS.OK, 0, updatedMed,req); 
    }
    catch(error)
    {
        console.log(error);
        return apiResponse(res, true, [], ERROR_MSG['SYSTEM-ERROR'], SERVER_ERROR.internalServerError, 0, [])
    }
}