const express = require('express');
const router = express.Router();
const config = require('config');
const fs = require('fs');

const ModelPath = '../../models/';
const Upload = require(ModelPath + 'Upload.js');
const View = require(ModelPath + 'View.js');

const wrap = require('../../util/wrap.js');

const insertView = async (req, upload) =>
    Promise.all([
        View.create({
            uid: upload.uid,
            uploader: upload.uploader,
            remoteAddress: req.ip,
            userAgent: req.headers['user-agent']
        }),
        Upload.updateOne({uid: upload.uid}, {$inc: {views: 1}})
    ]);

router.get('/:uid', wrap(async (req, res) => {
    const upload = await Upload.findOne({uid: req.params.uid});
    if (!upload)
        return res.status(404).json({message: 'File not found.'});

    // Increment the file's view counter and insert a a view record
    await insertView(req, upload);

    // Whether the file should be an attachment or displayed inline on the page
    const mimetype = upload.file.mime.split('/');
    const inlineMimeTypes = config.get('View.inlineMimeTypes').map(type => type.split('/'));
    let inline = inlineMimeTypes.some(type =>
        (mimetype[0] === type[0] || type[0] === '*') &&
        (mimetype[1] === type[1] || type[1] === '*'));

    res.status(200);
    res.set({
        'Content-Disposition': inline ? 'inline' : 'attachment; filename="' + upload.file.originalName + '"',
        'Content-Type': upload.file.mime
    });

    fs.createReadStream(upload.file.path)
        .pipe(res);
}));

module.exports = router;