require('dotenv').config();
const S3 = require('aws-sdk/clients/s3');
const fs = require('fs');
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")
export {};

// aws common variables
const accessKeyId= process.env.AWS_ACCESS_KEY_ID;
const secretAccesskey= process.env.AWS_SECRET_ACCESS_KEY;
const region =process.env.AWS_REGION;
const bucket_name =process.env.AWS_BUCKET_NAME;

// used for s3
const s3 = new S3({
    region,
    accessKeyId,
    secretAccesskey,
}) 

// upload file in s3 bucket
exports.uploadFile = async (req, res) => {
    try
    {
        let lang = 'en'
        const file = req.file
        const filestream = fs.createReadStream(file.path);
        const params = {
            Bucket: bucket_name,
            Key: 'common/'+file.filename, // File name you want to save as in S3
            Body: filestream,
            ContentEncoding: 'base64',
            ContentType: file.mimetype,
            ACL:'public-read'
        }

        s3.upload(params, (err, data) => {
            if (err) { 
                return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang}`], SERVER_ERROR.internalServerError, 0, [],req)
            }
            fs.unlink(file.path, function (err) {
                if (err) throw err;
                // if no error, file has been deleted successfully
            });
            return apiResponse(res, false, [], '', SUCCESS.OK, 0, {Location:data.Location},req)
        });    
    }
    catch(error)
    {
        console.log(error);
        throw new Error(error);
    }
    
}

// s3 user logger for file
exports.uploadFileLoggedUser = async (req, res) => {
    try 
    {
        let lang = 'en'
        const file = req.file
        const filestream = fs.createReadStream(file.path);
        const params = {
            Bucket: bucket_name,
            Key: file.id+"/"+file.filename, // File name you want to save as in S3
            Body: filestream,
            ContentEncoding: 'base64',
            ContentType: file.mimetype,
            ACL:'public-read'
        }

        s3.upload(params, (err, data) => {
            if (err) { 
                return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang}`], SERVER_ERROR.internalServerError, 0, [],req)
            }
            return apiResponse(res, false, [], '', SUCCESS.OK, 0, {Location:data.Location},req)
        });   
    }
    catch(error)
    {
        console.log(error);
        throw new Error(error);
    } 

}

// file stream
exports.getFileStream = async (req, res) => {
    try
    {

        let lang = 'en'
        const file = req.file
        const downloadParams = {
            key:file.filekey,
            Bucket:bucket_name
        } 
    
        s3.getObject(downloadParams, (err, data) => {
            if(err){
                return apiResponse(res, true, [], ERROR_MSG[`SYSTEM-ERROR-${lang}`], SERVER_ERROR.internalServerError, [],req)
            }
            return apiResponse(res, false, [], '', SUCCESS.OK, 0, {file_readstream:data.createReadStream},req)
        })
    }
    catch(error)
    {
        console.log(error);
        throw new Error(error);
    } 

}