const winston = require('winston');
const fs = require('fs'); //file system
const { User } = require('../../models/user')
const { Admin } = require('../../models/admin/admin')
const { apiResponse} = require("../response/response")
const { SUCCESS, REDIRECTION, CLIENT_ERROR, SERVER_ERROR } = require("../response/statusCode")
const {ERROR_MSG, SUCCESS_MSG} = require("../response/messages")
export {};

const validToken = async (req, res, next) => {
    try{    
        // next(); 
        let lang = req.headers['accept-language'] ? req.headers['accept-language'] : 'en';
        const authHeader = String(req.headers['authorization'] || '');
        const authType = req.headers['auth-type'];

        if (authHeader.startsWith('Bearer ')) {
            const token = authHeader.substring(7, authHeader.length);
            if (!token) return apiResponse(res, true, [], ERROR_MSG[`TOKEN-NOT-PROVIDED-${req.headers['accept-language']}`], CLIENT_ERROR.badRequest, 0, [])
            let existingUser;
            if(authType === 'admin'){
                existingUser = await Admin.findOne({auth_token:token},
                    { _id: 1, is_active:1, is_deleted:1 })

                if(!existingUser) return apiResponse(res, true, [], ERROR_MSG[`Session-expired-en`], 409,0, []);
                if(!existingUser.is_active) return apiResponse(res, true, [], ERROR_MSG['ACCOUNT-DEACTIVATED'], CLIENT_ERROR.badRequest,0, []);
                if(existingUser.is_deleted) return apiResponse(res, true, [], ERROR_MSG['ACCOUNT-DELETED'], CLIENT_ERROR.badRequest,0, []);
            }else{
                existingUser = await User.findOne(
                    {auth_token: { $in : token}},
                    { _id: 1, is_deleted:1, is_blocked_by_admin:1, is_account_active:1 , email : 1 }
                    );
                if(!existingUser)
                {
                    return apiResponse(res, true, [], ERROR_MSG[`OTP-AGAIN-${req.headers['accept-language']}`], 409, 0, [],req);
                }
                req['user'] =  { _id :existingUser._id , email : 1 , token : token };
                if(existingUser.is_deleted) return apiResponse(res, true, [], ERROR_MSG[`ACCOUNT-DELETED-${lang}`], CLIENT_ERROR.badRequest,0, []);

                if(existingUser.is_blocked_by_admin) return apiResponse(res, true, [], ERROR_MSG[`ACCOUNT-BLOCKED-BY-ADMIN-${lang}`], CLIENT_ERROR.badRequest,0, {logout : true  });
        
                if(!existingUser.is_account_active) return apiResponse(res, true, [], ERROR_MSG[`ACCOUNT-DEACTIVATED-${lang}`], CLIENT_ERROR.badRequest,0, {logout : true});
            }
            if(!existingUser){
                return apiResponse(res, true, [], ERROR_MSG[`INVALID-TOKEN-${req.headers['accept-language']}`], 409, 0, [],req)
            }
            next();
        }else{
            return apiResponse(res, true, [], ERROR_MSG[`BEARER-TOKEN-NOT-PROVIDED-${req.headers['accept-language']}`], CLIENT_ERROR.badRequest, 0, [],req)
        }
        
    }catch(e){
        winston.error(e.message, e);
        console.log(e)
        return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${req.headers['accept-language']}`], SERVER_ERROR.internalServerError, 0, [],req)
    }
}

const isDoctorHospital = async ( req ,res , next ) => 
{
    try
    {
        const authHeader = String(req.headers['authorization'] || '');
        const authType = req.headers['auth-type'];
        if (authHeader.startsWith('Bearer ')) {
            const token = authHeader.substring(7, authHeader.length);
            if (!token) return apiResponse(res, true, [], ERROR_MSG['TOKEN-NOT-PROVIDED'], CLIENT_ERROR.badRequest, 0, [])
            let existingUser;
        
            existingUser = await User.findOne(
                {auth_token: { $in : token}},
                { _id: 1, is_deleted:1, is_blocked_by_admin:1, is_account_active:1 , email : 1 }
                );
            if(!existingUser){
                return apiResponse(res, true, [], ERROR_MSG['INVALID-TOKEN'], 409, 0, [],req)
            }
            next();
        }else{
            return apiResponse(res, true, [], ERROR_MSG['BEARER-TOKEN-NOT-PROVIDED'], CLIENT_ERROR.badRequest, 0, [],req)
        }
    }
    catch(e){
        winston.error(e.message, e);
        console.log(e)
        return apiResponse(res, true, [], ERROR_MSG['SYSTEM-ERROR'], SERVER_ERROR.internalServerError, 0, [],req)
    }
}

module.exports = {validToken};