const { Router } = require('express')
const { expressjwt } = require('express-jwt')

const { getAnswer } = require('../../utils/common')

const { ListModel } = require('./model/todo/list')
const { ItemModel } = require('./model/todo/item')
const { TOKEN_KEY } = require('./const')
const { requiredValidate } = require('./utils')

const router = Router()

router.get('/list', async (req, res) => {
  const items = await ListModel
    .find({})
    .populate('items')
    .exec()

  res.send(getAnswer(null, items))
})

router.get('/:todoId', async (req, res) => {
  const { todoId } = req.params

  const list = await ListModel
    .findById(todoId)
    .populate('items')
    .exec()

  if (!list) {
    throw new Error('list not found')
  }

  res.send(getAnswer(null, list))
})

router.use(expressjwt({ secret: TOKEN_KEY, algorithms: ['HS256'] }))

router.post('/', requiredValidate('title'), async (req, res) => {
  const { title } = req.body
  const userId = req.auth.id

  const list = await ListModel.create({ title, createdBy: userId })

  res.send(getAnswer(null, list))
})

router.post('/item', requiredValidate('todoId', 'title'), async (req, res) => {
  const { todoId, title } = req.body

  const list = await ListModel.findById(todoId)

  if (!list) {
    throw new Error('list not found')
  }

  const userId = req.auth.id
  const item = await ItemModel.create({ title, createdBy: userId })

  list.items.push(item)
  await list.save()

  res.send(getAnswer(null, item))
})

// closed = new Date().toISOString()
router.patch('/item/:itemId', async (req, res) => {
  const { itemId } = req.params
  const { title, done } = req.body

  const item = await ItemModel.findById(itemId)

  if (!item) {
    throw new Error('item not found')
  }

  if (title) {
    item.title = title
  }

  if (done) {
    item.done = done
    item.closed = done ? new Date().toISOString() : null
  }

  await item.save()

  res.send(getAnswer(null, item))
})

router.delete('/item/:itemId', async (req, res) => {
  const { itemId } = req.params

  await ItemModel.findByIdAndDelete(itemId)

  res.send(getAnswer(null, { ok: true }))
})


module.exports = router