const express       = require('express'),
        router      = express.Router({ mergeParams: true }),
        fs          = require('fs'),
        busboy      = require('connect-busboy'),
        middleware  = require('../middleware'),
        Account     = require('../models/account'),
        Recipe      = require('../models/recipe'),
        Step        = require('../models/step');

// CREATE PAGE
router.get('/create', middleware.isLoggedIn, middleware.getCats, middleware.getPops, (req, res) => {
    const dpath = `/var/www/inter-kitchen/public/images/${req.user.username}`;
    fs.readdir(dpath, (err, files) => {
        if(err) throw err;
        const page = 'create';
        res.render('recipe/create', { 
            page: page, 
            usr: req.user,
            popular: req.lmPop,
            cats: req.cats, 
            files: files
        });
    });
});

//Create
router.post('/', middleware.isLoggedIn, (req, res) => {
    let author = {
        id: req.user._id,
        username: req.user.username
    }
    req.body.recipe.author = author;
    Recipe.create(req.body.recipe, (err, newRecipe) => {
        if(err) {
            console.log(err);
            req.flash("error", err.message);
            res.redirect('/recipe/create');
        } else {
            newRecipe.isLiked = 0;
            newRecipe.save();
            console.log('Created recipe: ', newRecipe);
        }
    });
    const maxSteps = [
        req.body.step1, req.body.step2, req.body.step3,
        req.body.step4, req.body.step5, req.body.step6,
        req.body.step7, req.body.step8, req.body.step9,
        req.body.step10, req.body.step11, req.body.step12,
        req.body.step13, req.body.step14, req.body.step15,
        req.body.step16, req.body.step17, req.body.step18,
        req.body.step19, req.body.step20
    ];
    for( i = 0; i <= req.body.recipe.nsteps - 1; i++ ) {
        Step.create(maxSteps[i], (err, newStep) => {
            if(err) {
                console.log(err);
                req.flash("error", err.message);
                res.redirect('/recipe/create');
            } else {
                console.log('Created step: ', newStep);
                Recipe.findOne({title: req.body.recipe.title}, (err, foundRecipe) => {
                    if(err) {
                        console.log(err);
                        req.flash("error", err.message);
                        res.redirect('back');
                    } else {
                        foundRecipe.steps.push(newStep);
                        foundRecipe.save();
                        console.log('Full recipe: ', foundRecipe);
                    }
                });
            }
        });
    }
    res.redirect(`/`);
});

// SHOW UPLOAD
router.get(`/image/upload`, middleware.getCats, middleware.getPops, (req, res) => {
    const page = 'create';
    res.render(`recipe/upload`, {
        page: page,
        usr: req.user,
        popular: req.lmPop,
        cats: req.cats 
    });
});

// UPLOAD
router.post(`/image`, middleware.isLoggedIn, (req, res) => {
    let fstream;
    req.pipe(req.busboy);
    req.busboy.on('file', (fieldname, file, filename) => {
        console.log(`Uploading ${fieldname}`);
        const home = `/var/www/inter-kitchen/public/images/${req.user.username}/`;
        fstream = fs.createWriteStream(home + filename);
        file.pipe(fstream);
        fstream.on('close', () => {
            console.log(`Finished uploading ${filename}`);
            res.redirect(`/recipe/create`);
        })
    })
});

// SHOW 
router.get('/:id', middleware.getCats, middleware.getPops, middleware.getAccount, (req, res) => {
    Recipe.findById(req.params.id).populate('steps').exec((err, foundRecipe) => {
        if(err) {
            console.log(err);
        } else {
            const splitted = (ing) => { 
                return ing.toString().split(', ');
            }
            const ig = splitted(foundRecipe.ingridients); // Separate ingridients
            foundRecipe.steps.sort((a, b) => a.number - b.number); // Make sure steps are in numerical order
            if(req.user) {
                let recAuthor = {
                    id: foundRecipe.author.id,
                    username: foundRecipe.author.username
                }
                Account.findOne({ author: recAuthor }, (err, foundRecAuthor) => {
                    if(err) {
                        console.log(err);
                    } else {
                        const page = 'show';
                        res.render('recipe/show', { 
                            page: page, 
                            usr: req.user,
                            account: req.daAccount, 
                            recipe: foundRecipe,
                            recAuthor: foundRecAuthor, 
                            ingridients: ig, 
                            popular: req.lmPop,
                            recipes: req.recipes,
                            cats: req.cats 
                        });
                    }
                });
            } else {
                let a = {
                    id: foundRecipe.author.id,
                    username: foundRecipe.author.username
                }
                Account.findOne({ author: a }, (err, foundRecAuthor) => {
                    if(err) {
                        console.log(err);

                    } else {
                        const page = 'show';
                        res.render('recipe/show', { 
                            page: page, 
                            usr: req.user,
                            recAuthor: foundRecAuthor, 
                            recipe: foundRecipe, 
                            ingridients: ig, 
                            popular: req.lmPop,
                            recipes: req.recipes,
                            cats: req.cats 
                        });
                    }
                });
            }
        }
    });
});

// EDIT
router.get('/:id/edit', middleware.checkRecipeOwnership, middleware.getCats, middleware.getPops, (req, res) => {
    Recipe.findById(req.params.id).populate('steps').exec((err, foundRecipe) => {
        if(err) {
            console.log(err);
        } else {
            const dpath = `/var/www/inter-kitchen/public/images/${req.user.username}`;
            fs.readdir(dpath, (err, files) => {
                if(err) throw err;
                const page = 'account'
                foundRecipe.steps.sort((a, b) => a.number - b.number); // Make sure steps are in numerical order
                res.render('recipe/edit', { 
                    page: page, 
                    usr: req.user, 
                    recipe: foundRecipe,
                    recipes: req.recipes, 
                    popular: req.lmPop,
                    cats: req.cats, 
                    files: files
                });
            
            })    
        }
    });
});

// UPDATE
router.put('/:id', middleware.checkRecipeOwnership, (req, res) => {
    Recipe.findByIdAndUpdate(req.params.id, req.body.recipe, (err, updatedRecipe) => {
        if(err) {
            console.log(err);
            req.flash("error", err.message);
            res.redirect('back');
        } else {
            console.log(`Updated Recipe: ${updatedRecipe}`);
            res.redirect(`/recipe/${req.params.id}`);
        }
    });
});

// Delete
router.delete('/:id', middleware.checkRecipeOwnership, (req, res) => {
    Recipe.findByIdAndRemove(req.params.id, (err) => {
        if(err) {
            console.log(err);
            req.flash("error", err.message);
            res.redirect('back');
        } else {
            res.redirect(`/account/${req.user._id}`);
        }
    });
});

// EDIT STEPS
router.get('/:id/step/:sid/edit', middleware.checkStepOwnership, middleware.getCats, middleware.getPops, (req, res) => {
    Recipe.findById(req.params.id, (err, foundRecipe) => {
        if(err) {
            console.log(err);
        } else {
            Step.findById(req.params.sid, (err, foundStep) => {
                if(err) {
                    console.log(err);
                } else {
                    const page = 'account'
                    res.render('recipe/editSteps', { 
                        page: page, 
                        usr: req.user, 
                        step: foundStep, 
                        recipe: foundRecipe,
                        recipes: req.recipes, 
                        popular: req.lmPop,
                        cats: req.cats 
                    });
                }
            });
        }
    });
});

// UPDATE STEPS
router.put('/:id/step/:sid', middleware.checkStepOwnership, (req, res) => {
    Step.findByIdAndUpdate(req.params.sid, req.body.step, (err, updatedStep) => {
        if(err) {
            console.log(err);
            req.flash("error", err.message);
            res.redirect('back');
        } else {
            console.log(`Updated step: ${updatedStep}`);
            res.redirect(`/recipe/${req.params.id}/edit`);
        }
    });
});

// SHOW CREATE STEP 
router.get('/:id/step/create', middleware.checkRecipeOwnership, middleware.getCats, middleware.getPops, (req, res) => {
    Recipe.findById(req.params.id, (err, foundRecipe) => {
        if(err) {
            console.log(err);
        } else {
            const page = 'create';
            res.render('recipe/createStep', { 
                page: page, 
                usr: req.user, 
                recipe: foundRecipe,
                recipes: req.recipes, 
                popular: req.lmPop,
                cats: req.cats 
            });
        }
    });
});

// CREATE A NEW STEP
router.post('/:id/step', middleware.checkRecipeOwnership, (req, res) => {
    Step.create(req.body.newStep, (err, newStep) => {
        if(err) {
            console.log(err);
            req.flash("error", err.message);
            res.redirect('back');
        } else {
            console.log('Created step: ', newStep);
            Recipe.findOne({_id: req.params.id}, (err, foundRecipe) => {
                if(err) {
                    console.log(err);
                } else {
                    foundRecipe.steps.push(newStep);
                    foundRecipe.save();
                    console.log('Full recipe: ', foundRecipe);
                }
            });
        }
        res.redirect(`/recipe/${req.params.id}/edit`);
    });
});

// DELETE STEP
router.delete('/:id/step/:sid', middleware.checkStepOwnership, (req, res) => {
    Step.findByIdAndRemove(req.params.sid, (err) => {
        if(err) {
            console.log(err);
            req.flash("error", err.message);
            res.redirect('back');
        } else {
            res.redirect(`/recipe/${req.params.id}/edit`);
        }
    })
});

// SAVE RECIPE
router.put('/:id/save', middleware.isLoggedIn, (req, res) => {
    Recipe.findById(req.params.id, (err, foundRecipe) => {
        if(err) {
            console.log(err);
        } else {
            let ath = {
                id: req.user._id,
                username: req.user.username
            }
            Account.findOne({ author: ath }, (err, foundAccount) => {
                if(err) {
                    console.log(err);
                } else {
                    if(!(foundRecipe.isLiked)) {
                        foundRecipe.isLiked = 1;
                        foundRecipe.save();
                        foundAccount.favorites.push(foundRecipe);
                        foundAccount.save();
                        res.redirect(`/recipe/${req.params.id}`);
                    } else {
                        foundRecipe.isLiked = foundRecipe.isLiked + 1;
                        foundRecipe.save();
                        foundAccount.favorites.push(foundRecipe);
                        foundAccount.save();
                        res.redirect(`/recipe/${req.params.id}`);
                    }
                }
            });
        }
    });
})

// UNSAVE RECIPE
router.put(`/:id/unsave`, (req, res) => {
    Recipe.findById(req.params.id, (err, foundRecipe) => {
        if(err) {
            console.log(err);
        } else {
            let ath = {
                id: req.user._id,
                username: req.user.username
            }
            Account.findOne({ author: ath }, (err, foundAccount) => {
                if(err) {
                    console.log(err);
                } else {
                    foundRecipe.isLiked = foundRecipe.isLiked - 1;
                    foundRecipe.save();
                    console.log(foundAccount.favorites);
                    const index = foundAccount.favorites.indexOf(req.params.id);
                    if(index > -1) {
                        foundAccount.favorites.splice(index, 1);
                    }
                    console.log(foundAccount.favorites);
                    foundAccount.save();
                    console.log(foundAccount.favorites);
                    res.redirect(`/recipe/${req.params.id}`);
                }
            });
        }
    })
});

module.exports = router;