const express = require('express');
const { model: ToDos } = require('../models/Todos');
const auth = require('../middlewares/auth');
const routes = express.Router();


routes.post('/todo/add', auth, async (req, res) => {
    const newTodo = req.body;

    const fieldsToAdd = Object.keys(newTodo);
    const fieldsInModel = ['title', 'description'];
    const isAdditionAllowed = fieldsToAdd.every((field) => fieldsInModel.includes(field));

    if (!isAdditionAllowed) {
        return res.status(400).send({ error: 'Invalid fields to Add!' });
    }

    try {
        const todo = await ToDos({
            ...newTodo,
            user: req.user._id,
        });

        await todo.save();

        res.send({ todo });
    }
    catch (e) {
        res.status(400).send(e);
    }
});

routes.post('/todo/list', auth, async (req, res) => {
    try {

        const todos = await ToDos.find({
            user: req.user._id
        });

        res.send(todos);
    }
    catch (e) {
        res.status(500).send;
    }
});

routes.patch('/todo/update', auth, async (req, res) => {
    const changedTodo = req.body;
    const fieldsToUpdate = Object.keys(changedTodo);
    const fieldsInModel = ['_id', 'important', 'done'];
    const isUpdateAllowed = fieldsToUpdate.every((field) => fieldsInModel.includes(field));

    if (!isUpdateAllowed) {
        return res.status(400).send({ error: 'Invalid fields to update!' });
    }
    const updateObj = {};
    if (changedTodo.hasOwnProperty('important')) {
        updateObj.important = changedTodo.important;
    }

    if (changedTodo.hasOwnProperty('done')) {
        updateObj.done = changedTodo.done;
    }

    try {
        const todo = await ToDos.findByIdAndUpdate(
            {
                _id: changedTodo._id,
                user: req.user._id,
            },
            updateObj,
            { new: true, runValidators: true }
        );

        if (!todo) {
            return res.status(404).send();
        }

        res.send(todo);

    } catch (e) {
        res.status(400).send(e);
    }
});

routes.delete('/todo/delete', auth, async (req, res) => {
    try {
        const todo = await ToDos.findById(req.body._id);

        await todo.remove();
        res.send(todo);

    } catch (e) {
        res.status(500).send();
    }
});


module.exports = routes;