var mongoose = require('mongoose');
var passport = require('passport');
var config = require('../config/database');
require('../config/passport')(passport);
//require('../auth/facebook')(passport);
var express = require('express');
var jwt = require('jsonwebtoken');
var router = express.Router();
var User = require("../models/user");
var FileMongo = require("../models/FileMongo");
var FolderMongo = require("../models/FolderMongo");
var Book = require("../models/book");
var fs = require('fs');
var multer = require('multer');
var upload = multer({ dest: './public/' });

var passportFacebook = require('../auth/facebook');
var passportGoogle = require('../auth/google');
var passportGitHub = require('../auth/github');


// recuperer l'extention d'un fichier en fonction de son nom, par exemple : exemple.pdf recupera juste ".pdf"
getStringExtention = function(monFile){
    return ( monFile.name.indexOf('.') > 0 ) ? '.' + monFile.name.split('.').pop().toLowerCase() : '';
};

/* creation Token */
getToken = function (headers) {
    if (headers && headers.authorization) {
        var parted = headers.authorization.split(' ');
        if (parted.length === 2) {
            return parted[1];
        } else {
            return null;
        }
    } else {
        return null;
    }
};



router.use(function(req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});
/* GET home page. */
router.get('/', function(req, res, next) {
    res.send('Express RESTful API');
});

//inscription email/password le username est l'email
router.post('/signup', function(req, res) {
    if (!req.body.username || !req.body.password) {
        res.json({success: false, msg: 'Please pass username and password.'});
    } else {
        var newUser = new User({
            username: req.body.username,
            password: req.body.password
        });
        // save the user
        newUser.save(function(err) {
            if (err) {
                return res.json({success: false, msg: 'Username already exists.'});
            }
            res.json({success: true, msg: 'Successful created new user.'});
        });
    }
});

/* SAVE FILE */
router.post('/uploadFileMongo', function(req, res, next) {
    FileMongo.create(req.body, function (err, post) {
        if (err){
            return next(err);
        }
        res.json(post);
    });
});

/* SAVE URL FILE */
router.post('/saveURLFileMongo', function(req, res, next) {
    FileMongo.findOneAndUpdate({_id : req.body._id, owner: req.body.owner}, {url: req.body.url},{new: true}).then((data) =>{
        if(data === null){
            throw new Error('File Not Found');
        }
        res.json({ message: 'File updated!' });
    }).catch( (error) => {
        //Deal with all your errors here with your preferred error handle middleware / method
        res.status(500).json({ message: 'Some Error!' });
        console.log(error);
    });
});

/* SAVE FOLDER */
router.post('/createFolder', function(req, res, next) {
    FolderMongo.create(req.body, function (err, post) {
        if (err){
            return next(err);
        }
        res.json(post);
    });
});



/* DELETE FILE */
router.post('/deleteFileMongo', function(req, res, next) {
    console.log(JSON.stringify(req.body));
    FileMongo.remove({_id : req.body._id, name: req.body.name, owner: req.body.owner}, function (err, post) {
        if (err){

            return next(err);
        }
        //Delete file multer dans Public
        fs.unlink('./public/' + req.body._id + getStringExtention(req.body));

        res.json(post);

    });
});

/* DELETE FOLDER */
router.post('/deleteFolderMongo', function(req, res, next) {
    FolderMongo.remove({_id : req.body._id, name: req.body.name, owner: req.body.owner}, function (err, post) {
        if (err){
            return next(err);
        }
        res.json(post);

    });
});

/* Rename FOLDER */
router.post('/renameFolderMongo', function(req, res, next) {
    FolderMongo.findOneAndUpdate({_id : req.body._id, owner: req.body.owner}, {name: req.body.name},{new: true}).then((data) =>{
        if(data === null){
            throw new Error('Folder Not Found');
        }
        res.json({ message: 'Folder updated!' });
    }).catch( (error) => {
        //Deal with all your errors here with your preferred error handle middleware / method
        res.status(500).json({ message: 'Some Error!' });
        console.log(error);
    });
});

/* Move Folder */
router.post('/moveFolder', function(req, res, next) {
    FolderMongo.findOneAndUpdate({_id : req.body._id, owner: req.body.owner}, {path: req.body.path, parent: req.body.parent},{new: true}).then((data) =>{
        if(data === null){
            throw new Error('Folder Not Found');
        }
        res.json({ message: 'Folder updated!' });
    }).catch( (error) => {
        //Deal with all your errors here with your preferred error handle middleware / method
        res.status(500).json({ message: 'Some Error!' });
        console.log(error);
    });
});

/* Move File */
router.post('/moveFile', function(req, res, next) {
    FileMongo.findOneAndUpdate({_id : req.body._id, owner: req.body.owner}, {path: req.body.path},{new: true}).then((data) =>{
        if(data === null){
            throw new Error('File Not Found');
        }
        res.json({ message: 'File updated!' });
    }).catch( (error) => {
        //Deal with all your errors here with your preferred error handle middleware / method
        res.status(500).json({ message: 'Some Error!' });
        console.log(error);
    });
});


/* Rename FILE */
router.post('/renameFileMongo', function(req, res, next) {
    FileMongo.findOneAndUpdate({_id : req.body._id, owner: req.body.owner}, {name: req.body.name},{new: true}).then((data) =>{
        if(data === null){
            throw new Error('File Not Found');
        }
        res.json({ message: 'File updated!' });
    }).catch( (error) => {
        //Deal with all your errors here with your preferred error handle middleware / method
        res.status(500).json({ message: 'Some Error!' });
        console.log(error);
    });
});

/* Get Current folder */
router.post('/getMainFolder', function(req, res) {
    FolderMongo.findOne({
        path: req.body.path,
        owner: req.body.owner
    }, function(err, folder) {
        res.json(folder);
    });

});

/* Get tout les folders du mainFolder */
router.post('/getFolderList', function(req, res) {
    FolderMongo.find({
        parent: req.body.mainPath,
        owner: req.body.owner
    }, function(err, folder) {
        res.json(folder);
    });

});

/* Get tout les folders du user */
router.post('/getFolderAppList', function(req, res) {
    FolderMongo.find({
        owner: req.body.owner
    }, function(err, folder) {
        res.json(folder);
    });
});

/* Get tout les files du user */
router.post('/getFileAppList', function(req, res) {
    FileMongo.find({
        owner: req.body.owner
    }, function(err, file) {
        res.json(file);
    });
});

/* Get tout les files du mainFolder */
router.post('/getFileList', function(req, res) {
    FileMongo.find({
        path: req.body.mainPath,
        owner: req.body.owner
    }, function(err, files) {
        res.json(files);
    });

});
router.post('/getUserById', function(req, res) {
    User.findOne({
        _id: req.body.id
    }, function (err, user) {
        res.json(user);

    });
});
router.post('/getFileById', function(req, res) {
    console.log('yaa' + req.body.id);
    FileMongo.find({
        _id: req.body.id
    }, function (err, file) {
        res.json(file);

    });
});
/* Login */
router.post('/signin', function(req, res) {
    User.findOne({
        username: req.body.username
    }, function(err, user) {
        if (err) throw err;

        if (!user) {
            res.status(401).send({success: false, msg: 'Authentication failed. User not found.'});
        } else {
            // check if password matches
            user.comparePassword(req.body.password, function (err, isMatch) {
                if (isMatch && !err) {
                    console.log('user logged : ' + JSON.stringify(user));
                    // if user is found and password is right create a token
                    var token = jwt.sign(user.toJSON(), config.secret);
                    // return the information including token as JSON
                    res.json({success: true, token: 'JWT ' + token});
                } else {
                    res.status(401).send({success: false, msg: 'Authentication failed. Wrong password.'});
                }
            });
        }
    });
});

/* config multer dossier cible et nom du file : enregistrement du fichier dans le dossier public*/
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, './public/')
    },
    filename: function (req, file, cb) {
        cb(null, file.originalname)
    }
});

/* Multer upload */
router.post('/upload' , multer({storage: storage, limits: {fileSize: 30000000000}}).array("public[]", 12) ,function(req,res,next){
    res.send(req.files);
});

/* Get utilisateur courant */
router.get('/getCurrentUser', passport.authenticate('jwt'), function(req, res) {
    var token = getToken(req.headers);

    if (token) {
        res.json(req.user);
    } else {
        return res.status(403).send({success: false, msg: 'Unauthorized.'});
    }
});





/* GET users listing. */
router.get('/', ensureAuthenticated, function(req, res, next) {
    res.render('user', { user: req.user });
});

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) { return next(); }
    res.redirect('/api/login');
}
/* FACEBOOK ROUTER */
router.get('/facebook', passportFacebook.authenticate('facebook'),
    function(req, res) {
        console.log('facebook user : '+ req.user );
        // Successful authentication, redirect home.
        res.json({user: req.user});
});

router.get('/facebook/callback', passportFacebook.authenticate('facebook'),
    function(req, res) {
        console.log('facebook user : '+ req.user );
        JSON.stringify(req.user);
        var myUser = req.user.toString();
        //res.json({user: myUser});
        res.redirect('/main/'+req.user._id);
        // Successful authentication, redirect home.

});


/* GOOGLE ROUTER */
router.get('/google', passportGoogle.authenticate('google', { scope: 'https://www.google.com/m8/feeds' }));

router.get('/google/callback', passportGoogle.authenticate('google', { successRedirect : '/', failureRedirect: '/login' }), function(req, res) {
    res.redirect('/');
});
router.get('/google',
    passport.authenticate('google', { scope: ['read_stream', 'publish_actions'] })
);

/* GITHUB ROUTER */
router.get('/github', passportGitHub.authenticate('github', { scope: [ 'user:email' ] }));

router.get('/auth/github/callback', passportGitHub.authenticate('github', { successRedirect : '/', failureRedirect: '/login' }), function(req, res) {
    // Successful authentication, redirect home.
    res.redirect('/');
});
router.get('/github',
    passport.authenticate('github', { scope: ['read_stream', 'publish_actions'] })
);


module.exports = router;
