const express = require('express');

const simulationApp = express();

const libs = `${process.cwd()}/libs`;

const log = require(`${libs}/log`)(module);

const squel = require('squel');

const query = require(`${libs}/middlewares/query`).query;

const response = require(`${libs}/middlewares/response`);

const Simulation = require(`${libs}/models/simulation`);

const PQR = require(`${libs}/models/pqr`);

const passport = require('passport');

simulationApp.get('/time', (req, res, next) => {
    const maxTime = parseInt(req.query.max_time, 10);
    log.debug('maxTime: ', maxTime);
    if(isNaN(maxTime)) {
        res.status(400);
        next({
            status: 400,
            message: 'Invalid value for mandatory parameter max_time'
        });
    }
    res.json({
        result: Array.apply(null, {length: maxTime}).map(Number.call, Number).map((i)=>i+1)
    });
});

simulationApp.get('/pqr', (req, res) => {
    PQR.findOne((err, pqr) => {
        if(err) {
            log.error(err);
            return next({err});
        }

        res.json(pqr);
    });
});

simulationApp.put('/pqr', passport.authenticate('bearer', { session: false }), (req, res, next) => {
    let user = req.user.toObject();

    PQR.findOne((err, pqr) => {
        if(err) {
            log.error(err)
            return next({err});
        }

        if(!user.admin) {
            log.info(`Usuário ${user.email} tentou alterar o PQR, mas não tem privilégio`);
            res.statusCode = 401;
            return next({err: { msg: 'Unauthorized'}});
        }
        pqr.content = req.body.content || pqr.content;
        pqr.save((err) => {
            if(err) {
                log.error(err);
                return next({err});
            }
            res.json({msg: 'PQR updated'})
        });
    });
});

simulationApp.get('/', passport.authenticate('bearer', { session: false }), (req, res) => {
    let user = req.user.toObject();
    let query = Simulation.find({userId: user._id}).select('userId name');
    query.exec((err, simulations) => {
        if(err) {
            log.error(err);
            return next({err});
        }

        res.json(simulations);
    });

    // Simulation.find({userId: user._id}, (err, simulations) => {
    //     if(err) {
    //         log.error(err);
    //         return next({err});
    //     }

    //     res.json(simulations);
    // });
});

simulationApp.post('/', passport.authenticate('bearer', { session: false }), (req, res, next) => {
    let user = req.user.toObject();

    let simulation = new Simulation({
        userId: user._id,
        content: req.body.content,
        name: req.body.name
    });

    simulation.save((err) => {
        if(err) {
            log.error(err);
            return next({err});
        }

        res.json({msg: 'Simulation created', simulation});
    })
});

simulationApp.get('/:id', passport.authenticate('bearer', { session: false }), (req, res) => {
    let user = req.user.toObject();

    Simulation.findOne({_id: req.params.id, userId: user._id}, (err, simulation) => {
        if(err) {
            log.error(err);
            return next({err});
        }

        res.json(simulation);
    });
});

simulationApp.put('/:id', passport.authenticate('bearer', { session: false }), (req, res, next) => {
    let user = req.user.toObject();

    Simulation.findOne({_id: req.params.id, userId: user._id}, (err, simulation) => {
        if(err) {
            log.error(err);
            return next({err});
        }

        if(!simulation) {
            res.statusCode = 404;
            return next({err: { msg: 'Simulation not found'}});
        }

        simulation.content = req.body.content || simulation.content;
        simulation.name = req.body.name || simulation.name;

        simulation.save((err) => {
            if(err) {
                log.error(err);
                return next(err);
            }

            res.json(simulation);
        });
    });
});

simulationApp.delete('/:id', passport.authenticate('bearer', { session: false }), (req, res, next) => {
    let user = req.user.toObject();

    Simulation.remove({_id: req.params.id, userId: user._id}, (err, simulation) => {
        if(err) {
            log.error(err);
            return next({err});
        }

        res.json({msg: 'Simulation removed'});
    });
});

module.exports = simulationApp;