const router = require('express').Router()
const { promisify } = require('util')
const jwt = require('jsonwebtoken')
const fs = require('fs')
const path = require('path')
const md5 = require('crypto-js/md5')

const { JWT_SECRET_KEY } = require('./constants')
const { getResponse } = require('../../../utils/common')
const { connect, getPeoplesData, createDept, getDepts, getDeptData, deleteDeptById, setUsers, authenticate } = require('./controllers')

connect()

router.get('/depts', async (req, res) => {
    const errors = []
    const depts = await getDepts().catch((e) => errors.push(e.message))
    res.send(getResponse(errors, depts))
})

router.get('/peoples', async (req, res) => {
    const errors = []
    const peoplesData = await getPeoplesData().catch((e) => errors.push(e.message))
    res.send(getResponse(errors, peoplesData))
})

router.post('/depts/create', async (req, res) => {
    const errors = []
    const deptData = await createDept(req.body.data).catch((e) => errors.push(e.message))
    res.send(getResponse(errors, deptData))
})

router.get('/dept/:id', async (req, res) => {
    const errors = []
    const data = await getDeptData(req.params.id)
    res.send(getResponse(errors, data))
})

router.post('/dept/delete', async (req, res) => {
    const errors = []
    await deleteDeptById(req.body)
    res.send(getResponse(errors, 'success'))
});

router.post('/login', async (req, res, next) => {
    const auth = promisify(authenticate)
    try {
        console.log(req.body.login)
        console.log(req.body.password)
        const { hash, salt, ...user } = await auth(req.body.login, req.body.password)

        const token = jwt.sign({
            user,
        }, JWT_SECRET_KEY)
        req.session.regenerate(() => {
            req.session.user = user
            res.send({
                success: true,
                body: {
                    ...user,
                    token,
                },
                errors: [],
                warnings: [],
            })
        })
    } catch (error) {
        next(error)
    }
})

router.get('/tasks', (req, resp) => {
    resp.send(require('./stubs/tasks/tasks.json'))
})

router.post('/tasks/create', (req, resp) => {
    try {
        const { dept } = req.body
        const rawTasksData = fs.readFileSync(path.resolve(__dirname, './stubs/tasks/tasks.json'))
        const tasksData = JSON.parse(rawTasksData)
        const deptTasksData = tasksData.body.filter((data) => data.label === dept)

        const task = {
            id: md5(new Date()).toString(),
            number: 100,
            task: req.body.task,
            status: 'open',
            priority: req.body.priority,
            performer: req.body.performer,
            deadline: new Date(req.body.deadline).getTime(),
            lastChanged: new Date().getTime(),
            description: req.body.description,
        }

        if (!deptTasksData.length) {
            const newDeptTasksData = {
                label: req.body.dept,
                data: [task],
            }
            tasksData.body.push(newDeptTasksData)
        } else {
            tasksData.body.map((data) => {
                if (data.label === dept) {
                    return data.data.push(task)
                }
                return data
            })
        }
        fs.writeFileSync(path.resolve(__dirname, './stubs/tasks/tasks.json'), JSON.stringify(tasksData))
        resp.send({
            success: true,
            body: task,
            errors: [],
            warnings: [],
        })
    } catch (e) {
        resp.send('./stubs/error.json')
    }
})

router.post('/tasks/delete', (req, resp) => {
    resp.send(require('./stubs/tasks/delete.json'))
})

router.post('/tasks/edit', (req, resp) => {
    resp.send({
        success: true,
        body: req.body,
        errors: [],
        warnings: [],
    })
})

router.post('/sign-up', async (req, res, next) => {
    try {
        const { hash, salt, ...user } = await setUsers({
            login: req.body.login,
            password: req.body.password,
            mail: req.body.mail,
        })

        const token = jwt.sign({
            user,
        }, JWT_SECRET_KEY)
        req.session.regenerate(() => {
            req.session.user = user

            res.send({
                success: true,
                body: {
                    ...user,
                    token,
                },
                errors: [],
                warnings: [],
            })
        })
    } catch (error) {
        next(error)
    }
})

module.exports = router