const Controller = require('libflitter/controller/Controller')
const Codium = require('../../../models/api/Codium.model')
const Page = require('../../../models/api/Page.model')
const Node = require('../../../models/api/Node.model')

/*
 * FormCode Controller
 * -------------------------------------------------------------
 * Put some description here!
 */
class FormCode extends Controller {

    async create_new(req, res) {
        const PageId = req.params.PageId

        let page = await Page.findOne({UUID: PageId})
        if ( !page ) return res.status(404).message('Page not found with that ID.').api({})
        if ( !(await page.is_accessible_by(req.user, 'update')) ) return req.security.deny()

        const NodeId = req.params.NodeId

        let node = await Node.findOne({UUID: NodeId})
        if ( !node ) return res.status(404).message('Node not found with that ID.').api({})

        const code = new Codium({
            NodeId: node.UUID,
            PageId: page.UUID,
            code: '',
        })

        if ( req.body.Language ) {
            code.Language = req.body.Language
        }

        if ( req.body.code ) {
            code.code = req.body.code
        }

        if ( req.body.UUID ) {
            const existingUUID = await Codium.findOne({ UUID: req.body.UUID })
            if ( !existingUUID ) {
                code.UUID = req.body.UUID
            }
        }

        await code.version_save(`Added to page "${page.Name}"`, req.user.id)
        return res.api(code)
    }

    async get_config(req, res) {
        const PageId = req.params.PageId

        let page = await Page.findOne({UUID: PageId})
        if ( !page ) return res.status(404).message('Page not found with that ID.').api({})
        if ( !(await page.is_accessible_by(req.user)) ) return req.security.deny()

        const NodeId = req.params.NodeId

        let node = await Node.findOne({UUID: NodeId})
        if ( !node ) return res.status(404).message('Node not found with that ID.').api({})

        const code = await Codium.findOne({UUID: req.params.CodiumId})
        if ( !code ) return res.status(404).message('Unable to find code with that ID.').api({})

        return res.api(code)
    }

    async set_values(req, res) {
        const PageId = req.params.PageId

        let page = await Page.findOne({UUID: PageId})
        if ( !page ) return res.status(404).message('Page not found with that ID.').api({})
        if ( !(await page.is_accessible_by(req.user, 'update')) ) return req.security.deny()

        const NodeId = req.params.NodeId

        let node = await Node.findOne({UUID: NodeId})
        if ( !node ) return res.status(404).message('Node not found with that ID.').api({})

        const code = await Codium.findOne({UUID: req.params.CodiumId})
        if ( !code ) return res.status(404).message('Unable to find code with that ID.').api({})

        code.code = req.body.code
        code.Language = req.body.Language
        code.NodeId = node.UUID
        code.PageId = page.UUID
        await code.version_save(`Updated in page "${page.Name}"`, req.user.id)
        return res.api(code)
    }

    async drop_code(req, res) {
        const PageId = req.params.PageId

        let page = await Page.findOne({UUID: PageId})
        if ( !page ) return res.status(404).message('Page not found with that ID.').api({})
        if ( !(await page.is_accessible_by(req.user, 'update')) ) return req.security.deny()

        const NodeId = req.params.NodeId

        let node = await Node.findOne({UUID: NodeId})
        if ( !node ) return res.status(404).message('Node not found with that ID.').api({})

        const code = await Codium.findOne({UUID: req.params.CodiumId})
        if ( !code ) return res.status(404).message('Unable to find code with that ID.').api({})

        code.Active = false
        await code.version_save(`Deleted`, req.user.id)
        return res.api({})
    }
}

module.exports = exports = FormCode
