const FormController = require('flitter-auth/controllers/Forms')

/*
 * Handles views and processing for auth registration/login/logout/etc.
 * Most handlers are inherited from the default flitter-auth/controllers/Forms
 * controller, however you can override them here as you need.
 */
class Forms extends FormController {
    static get services() {
        return [...super.services, 'Vue', 'models', 'jobs']
    }

    async registration_provider_get(req, res, next) {
        if ( req.session.auth.flow ) {
            req.session.registrant_flow = req.session.auth.flow
        }

        return res.page('auth:register', {
            ...this.Vue.data({})
        })
    }

    async email_verify_keyaction(req, res, next) {
        if ( !req.trap.has_trap('verify_email') ) return res.redirect(req.session.email_verify_flow || '/dash/profile')
        req.user.email_verified = true
        await req.user.save()
        await req.trap.end()
        const url = req.session.email_verify_flow || '/dash/profile'
        return res.redirect(url)
    }

    async show_verify_email(req, res, next) {
        if ( !req.trap.has_trap('verify_email') ) return res.redirect(req.session.email_verify_flow || '/dash/profile')
        const verify_queue = this.jobs.queue('verifications')
        await verify_queue.add('SendVerificationEmail', { user_id: req.user.id })

        return res.page('public:message', {
            ...this.Vue.data({
                message: req.T('auth.must_verify_email'),
                actions: [
                    {
                        text: 'Send Verification E-Mail',
                        action: 'redirect',
                        next: '/auth/verify-email/sent',
                    },
                ],
            })
        })
    }

    async send_verify_email(req, res, next) {
        if ( !req.trap.has_trap('verify_email') ) return res.redirect(req.session.email_verify_flow || '/dash/profile')
        return res.page('public:message', {
            ...this.Vue.data({
                message: req.T('auth.verify_email_sent'),
                actions: [
                    {
                        text: 'Re-send Verification E-Mail',
                        action: 'redirect',
                        next: '/auth/verify-email/sent',
                    },
                ],
            })
        })
    }

    async finish_registration(req, res, next) {
        if ( req.trap.has_trap() && req.trap.get_trap() === 'registrant_flow' ) await req.trap.end()
        const dest = req.session.registrant_flow || '/dash/profile'
        return res.redirect(dest)
    }

    async login_provider_get(req, res, next) {
        const Setting = this.models.get('Setting')

        return res.page('auth:login', {
            ...this.Vue.data({
                login_message: req.session?.auth?.message || req.T('auth.sign_in_to_continue'),
                registration_enabled: await Setting.get('auth.allow_registration')
            }),
        })
    }

    async logout_provider_present_success(req, res, next) {
        return this.Vue.auth_message(res, {
            message: req.T('auth.logged_out'),
            next_destination: '/',
        })
    }

    async logout_provider_clean_session(req, res, next) {
        await req.user.logout(req)
        return next()
    }
}

module.exports = exports = Forms
