/*
 * v1 Controller
 * -------------------------------------------------------------
 * Put some description here!
 */
const Out = _flitter.model('v1:Out')
const Project = _flitter.model('v1:Project')
const Invite = _flitter.model('v1:Invite')
const Snippet = _flitter.model('v1:Snippet')
const share_api = {
    project: Project,
    snippet: Snippet,
}
const share_views = {
    project: async function(item){
        return '/dash/v1/project/view/'+item.id
    },
    snippet: async function(item){
        const project = await Project.findById(item.project_id);
        return '/dash/v1/project/snippet/'+project.id+'/view/'+item.uuid
    },
}
class v1 {

    /*
     * Serve the main page.
     */
    main(req, res){

        /*
         * Return the main view.
         * It must be passed the response.
         * View parameters can be passed as an optional third
         * argument to the view() method.
         */
        return view(res, 'view_name')
    }

    async new_out( req, res, next ){
        console.log(req.body)
        const project = await Project.findOne({ uuid: req.params.key })

        if ( !project ){
            return res.status(404).send({
                success: false,
                error: 'Project not found with specified key.'
            })
        }

        if ( !req.body.data ){
            return res.status(400).send({
                success: false,
                error: 'Missing data.'
            })
        }
        
        let data
        try {
            data = JSON.parse(req.body.data)
        }
        catch (e){
            return res.status(400).send({
                success: false,
                error: 'Invalid JSON.'
            })
        }
        
        if ( !data.brief ){
            data.brief = 'Breakpoint. (No Message.)'
        }
        
        const out = new Out({
            brief: data.brief,
            data: JSON.stringify(data.data),
            project_id: project.id
        })

        await out.save()

        return res.send({
            success: true
        })
    }

    async invite_show(req, res, next){
        const invite = await Invite.findById(req.params.id)
        if ( !invite ) _flitter.error(res, 404, {reason: 'Invitation not found with the specified URL.'})

        if ( invite.used ) _flitter.error(res, 401, {reason: 'This invitation link has been used or has expired.'})

        const share_model = share_api[invite.api_type];
        const project = await share_model.findById(invite.project_id)
        if ( !project ) _flitter.error(res, 404, {reason: 'This '+invite.api_type+' no longer exists.'})

        const user = await _flitter.model('User').findOne({uuid: invite.by_user_id})
        if ( !user ) _flitter.error(res, 500, {reason: 'This user no longer exists. Sorry.'})

        return _flitter.view(res, 'dash_v1:accept', {invite, project, created_by_user: user})
    }

    async invite_accept(req, res, next){
        const invite = await Invite.findById(req.params.id)
        if ( !invite ) _flitter.error(res, 404, {reason: 'Invitation not found with the specified URL.'})

        if ( invite.used ) _flitter.error(res, 401, {reason: 'This invitation link has been used or has expired.'})

        const share_model = share_api[invite.api_type];
        const project = await share_model.findById(invite.project_id)
        if ( !project ) _flitter.error(res, 404, {reason: 'This '+invite.api_type+' no longer exists.'})

        const user = await _flitter.model('User').findOne({uuid: invite.by_user_id})
        if ( !user ) _flitter.error(res, 500, {reason: 'This user no longer exists. Sorry.'})

        // if we're signed in
        if ( req.session.auth && req.session.auth.user ){
            if (  project.user_id !== req.session.auth.uuid && !project.shared_user_ids.includes(req.session.auth.uuid) ){
                project.shared_user_ids.push(req.session.auth.uuid)
                await project.save()
            }
            invite.used = true
            await invite.save()
            return res.redirect(await share_views[invite.api_type](project))
        }
        else {
            req.session.invite = true
            req.session.invite_data = {
                invite: invite.id,
                project: project.id,
                user: user.id,
            }

            return res.redirect('/dash/v1')
        }
    }
}

module.exports = exports = v1