from flask import flash, redirect, render_template, url_for
from flask_login import current_user, login_required, logout_user
from . import bp, tasks
from .forms import (
    ChangePasswordForm,
    EditGeneralSettingsForm,
    EditInterfaceSettingsForm,
    EditNotificationSettingsForm
)
from .. import db
from ..models import UserSettingJobStatusMailNotificationLevel


@bp.route('', methods=['GET', 'POST'])
@login_required
def index():
    change_password_form = ChangePasswordForm(
        current_user._get_current_object(),
        prefix='change_password_form'
    )
    edit_general_settings_form = EditGeneralSettingsForm(
        current_user._get_current_object(),
        prefix='edit_general_settings_form'
    )
    edit_interface_settings_form = EditInterfaceSettingsForm(
        prefix='edit_interface_settings_form'
    )
    edit_notification_settings_form = EditNotificationSettingsForm(
        prefix='edit_notification_settings_form'
    )

    if change_password_form.submit.data and change_password_form.validate():
        current_user.password = change_password_form.new_password.data
        db.session.commit()
        flash('Your changes have been saved')
        return redirect(url_for('.index'))
    if (
        edit_general_settings_form.submit.data
        and edit_general_settings_form.validate()
    ):
        current_user.email = edit_general_settings_form.email.data
        current_user.username = edit_general_settings_form.username.data
        db.session.commit()
        flash('Your changes have been saved')
        return redirect(url_for('.index'))
    if (
        edit_interface_settings_form.submit.data
        and edit_interface_settings_form.validate()
    ):
        current_user.setting_dark_mode = \
            edit_interface_settings_form.dark_mode.data
        db.session.commit()
        flash('Your changes have been saved')
        return redirect(url_for('.index'))
    if (
        edit_notification_settings_form.submit.data
        and edit_notification_settings_form.validate()
    ):
        current_user.setting_job_status_mail_notification_level = \
            UserSettingJobStatusMailNotificationLevel[
                edit_notification_settings_form.job_status_mail_notification_level.data  # noqa
            ]
        db.session.commit()
        flash('Your changes have been saved')
        return redirect(url_for('.index'))
    edit_general_settings_form.email.data = current_user.email
    edit_general_settings_form.username.data = current_user.username
    edit_interface_settings_form.dark_mode.data = \
        current_user.setting_dark_mode
    edit_notification_settings_form.job_status_mail_notification_level.data = \
        current_user.setting_job_status_mail_notification_level.name
    return render_template(
        'settings/index.html.j2',
        change_password_form=change_password_form,
        edit_general_settings_form=edit_general_settings_form,
        edit_interface_settings_form=edit_interface_settings_form,
        edit_notification_settings_form=edit_notification_settings_form,
        title='Settings'
    )


@bp.route('/delete')
@login_required
def delete():
    """
    View to delete current_user and all associated data.
    """
    tasks.delete_user(current_user.id)
    logout_user()
    flash('Your account has been marked for deletion')
    return redirect(url_for('main.index'))