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

const tools = require('../tools/general');

var server_constants = require('../tools/server_constants');

var { Project } = require('../models/project');

var { authenticate } = require('../middleware/authenticate');


var { Todo } = require('../models/todo');

const Hours = require('../models/hours');

const _ = require('lodash');

const { ObjectID } = require('mongodb');


router.post('/', authenticate, async (req, res) => {

  var body = _.pick(req.body, tools.allfieldTodoWithId());
  // tools.mylogshow('INPUT', body);
  var todo = new Todo(body);

  // todo.expiring_at = new Date(todo.expiring_at);

  // tools.mylog('ID :', todo._id, todo.descr, todo.userId, req.user._id);

  if (!('descr' in req.body)) {
    return res.status(400).send({ code: server_constants.RIS_CODE_LOGIN_ERR_GENERIC });
  }

  if (String(todo.userId) !== String(req.user._id)) {
    // I'm trying to write something not mine!
    tools.mylog('todo.userId = ', todo.userId, 'req.user._id', req.user._id)
    return res.status(404).send({ code: server_constants.RIS_CODE_TODO_CREATING_NOTMYUSER });
  }

  // tools.mylog('TODO POST :', todo.descr, todo._id);

  todo.modified = false;
  if (!todo.descr) {
    console.log('RECORD NON VALIDO !?', req.body)
  }

  let prevrec = null;
  if (!!todo && todo._id)
    prevrec = await Todo.findById(todo._id);

  return todo.save()
    .then((writeresult) => {
      let idobj = writeresult._id;
      return Todo.findById(idobj)
        .then(async (record) => {
          // tools.mylog('REC SAVED :', record.descr);

          let aggiorna = false;
          let titolo = '';

          if (prevrec) {
            if (todo.completed_at !== prevrec.completed_at) {
              aggiorna = true;
              titolo = 'Attività Completata!'
            }
          } else {
            aggiorna = true;
          }

          if (aggiorna) {
            await tools.sendNotificationToUser(todo.userId, titolo + ' ' + record.descr, record.descr, '/todo/' + todo.category, '', 'todo', [])
              .then(ris => {
                if (ris) {
                  return res.send({ record });
                } else {
                  // already sent the error on calling sendNotificationToUser
                }
              })
          }
        })
    }).catch((e) => {
      console.log('ERRORE in TODO POST', e.message);
      return res.status(400).send(e);
    });
});


router.patch('/:id', authenticate, (req, res) => {
  var id = req.params.id;
  var body = _.pick(req.body, tools.allfieldTodo());

  // tools.mylogshow('PATCH TODO: ', id);

  if (!ObjectID.isValid(id)) {
    tools.mylog('ERROR: id not VALID', id);
    return res.status(404).send();
  }

  Todo.findById(id)
    .then((todorec) => {

      if (todorec) {
        // Esiste, pertanto gli tolgo l'UserId generato in precedenza
        delete body["userId"];
      }

      Todo.findByIdAndUpdate(id, { $set: body }, { new: true })
        .then((todo) => {
          if (!todo) {
            tools.mylogshow(' TODO NOT FOUND !: id:', id, 'body: ', body);
            return res.status(404).send();
          }

          let level = 0;
          return Todo.calculateTreeTodo(todo.phase, todo.userId, todo.category, true, todo.category, false)
            .then(objdatacalc => {
              // tools.mylogshow(' TODO TO MODIFY: ', todo.descr, todo.expiring_at);

              if (todo.userId !== String(req.user._id) && todo.privacywrite === server_constants.Privacy.onlyme) {
                // I'm trying to write something not mine!
                return res.status(404).send({ code: server_constants.RIS_CODE_TODO_CREATING_NOTMYUSER });
              }

              todo.modified = false;

              // tools.mylog('PATCH ', todo.descr, todo._id);

              res.send({ todo, objdatacalc });
            });

        }).catch((e) => {
        tools.mylogserr('Error patch TODO: ', e);
        res.status(400).send();
      })
    })
});


router.get('/calc/:id', authenticate, (req, res) => {
  var id = req.params.id;

  let rec = {};

  Hours.calculateHoursTodo(id).then((hoursworked) => {
    rec.hoursworked = hoursworked;
    return res.send({ rec });
  }).catch((err) => {
    res.status(400).send();
  });

  return rec;

});

router.get('/:userId', authenticate, (req, res) => {
  var userId = req.params.userId;
  // var category = req.params.category;

  // tools.mylog('GET TODOS : ', req.params);

  if (!ObjectID.isValid(userId)) {
    return res.status(404).send();
  }

  if (userId !== String(req.user._id)) {
    // I'm trying to write something not mine!
    return res.status(404).send({ code: server_constants.RIS_CODE_TODO_CREATING_NOTMYUSER });
  }

  // Extract all the todos of the userId only
  Todo.getAllTodo(userId).then((objtodos) => {
    if (!!objtodos.arrtodos) {
      // tools.mylog('todos', objtodos.arrtodos.length);
      // tools.mylog('categories', objtodos.arrcategories.length);
    }

    res.send({ todos: objtodos.arrtodos, categories: objtodos.arrcategories });
  }).catch((e) => {
    console.log(e.message);
    res.status(400).send(e);
  });

});

router.get('/test', (req, res) => {

  const todo = {
    _id: new ObjectID(),
    // category: "personal",
    statustodo: 0,
    completed_at: new Date(),
    created_at: new Date(),
    descr: "Primo Task Esempio",
    enableExpiring: false,
    expiring_at: new Date(),
    modified: false,
    modify_at: new Date(),
    pos: 1,
    priority: 1,
    progress: 0,
    userId: users[0]._id
  };

  const TodoOne = new Todo(todo).save().then((err, ris) => {
    console.log('Err:', err);
    console.log('Ris:', ris);

  });

  res.send({});

});

router.get('/', (req, res) => {
  // var category = req.params.category;

  // tools.mylog('GET ALL TODOS ');

  // Extract all the todos of the userId only
  Todo.getAllTodo('').then((objtodos) => {
    if (!!objtodos.arrtodos) {
      // tools.mylog('todos', objtodos.arrtodos.length);
      // tools.mylog('categories', objtodos.arrcategories.length);
    }

    res.send({ todos: objtodos.arrtodos, categories: objtodos.arrcategories });
  }).catch((e) => {
    console.log(e.message);
    res.status(400).send(e);
  });

});

router.delete('/:id', authenticate, (req, res) => {
  var id = req.params.id;
  // var hide = req.params.hide;

  let hide = true;

  if (!ObjectID.isValid(id)) {
    return res.status(404).send();
  }

  if (hide) {
    Todo.findByIdAndUpdate(id, { $set: { deleted: true } }).then((todo) => {
      if (!todo) {
        return res.status(404).send();
      }
      res.send({ todo });
    }).catch((e) => {
      res.status(400).send();
    });

  } else {
    Todo.findByIdAndRemove(id).then((todo) => {
      if (!todo) {
        return res.status(404).send();
      }

      // tools.mylog('DELETED ', todo.descr, todo._id);

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

});


module.exports = router;
