from flask import abort, flash, redirect, render_template, url_for
from flask_breadcrumbs import register_breadcrumb
from app import db, hashids
from app.models import Avatar, Corpus, Role, User
from app.users.settings.forms import (
    UpdateAvatarForm,
    UpdatePasswordForm,
    UpdateNotificationsForm,
    UpdateAccountInformationForm,
    UpdateProfileInformationForm
)
from . import bp
from .forms import UpdateUserForm
from app.users.utils import (
    user_endpoint_arguments_constructor as user_eac,
    user_dynamic_list_constructor as user_dlc
)


@bp.route('')
@register_breadcrumb(bp, '.', '<i class="material-icons left">admin_panel_settings</i>Administration')
def admin():
    return render_template(
        'admin/admin.html.j2',
        title='Administration'
    )


@bp.route('/corpora')
@register_breadcrumb(bp, '.corpora', 'Corpora')
def corpora():
    corpora = Corpus.query.all()
    return render_template(
        'admin/corpora.html.j2',
        title='Corpora',
        corpora=corpora
    )


@bp.route('/users')
@register_breadcrumb(bp, '.users', '<i class="material-icons left">group</i>Users')
def users():
    users = User.query.all()
    return render_template(
        'admin/users.html.j2',
        title='Users',
        users=users
    )


@bp.route('/users/<hashid:user_id>')
@register_breadcrumb(bp, '.users.entity', '', dynamic_list_constructor=user_dlc)
def user(user_id):
    user = User.query.get_or_404(user_id)
    return render_template(
        'admin/user.html.j2',
        title=user.username,
        user=user
    )


@bp.route('/users/<hashid:user_id>/settings', methods=['GET', 'POST'])
@register_breadcrumb(bp, '.users.entity.settings', '<i class="material-icons left">settings</i>Settings')
def user_settings(user_id):
    user = User.query.get_or_404(user_id)
    update_account_information_form = UpdateAccountInformationForm(user)
    update_profile_information_form = UpdateProfileInformationForm(user)
    update_avatar_form = UpdateAvatarForm()
    update_password_form = UpdatePasswordForm(user)
    update_notifications_form = UpdateNotificationsForm(user)
    update_user_form = UpdateUserForm(user)

    # region handle update profile information form
    if update_profile_information_form.submit.data and update_profile_information_form.validate():
        user.about_me = update_profile_information_form.about_me.data
        user.location = update_profile_information_form.location.data
        user.organization = update_profile_information_form.organization.data
        user.website = update_profile_information_form.website.data
        user.full_name = update_profile_information_form.full_name.data
        db.session.commit()
        flash('Your changes have been saved')
        return redirect(url_for('.user_settings', user_id=user.id))
    # endregion handle update profile information form

    # region handle update avatar form
    if update_avatar_form.submit.data and update_avatar_form.validate():
        try:
            Avatar.create(
                update_avatar_form.avatar.data,
                user=user
            )
        except (AttributeError, OSError):
            abort(500)
        db.session.commit()
        flash('Your changes have been saved')
        return redirect(url_for('.user_settings', user_id=user.id))
    # endregion handle update avatar form

    # region handle update account information form
    if update_account_information_form.submit.data and update_account_information_form.validate():
        user.email = update_account_information_form.email.data
        user.username = update_account_information_form.username.data
        db.session.commit()
        flash('Profile settings updated')
        return redirect(url_for('.user_settings', user_id=user.id))
    # endregion handle update account information form

    # region handle update password form
    if update_password_form.submit.data and update_password_form.validate():
        user.password = update_password_form.new_password.data
        db.session.commit()
        flash('Your changes have been saved')
        return redirect(url_for('.user_settings', user_id=user.id))
    # endregion handle update password form

    # region handle update notifications form
    if update_notifications_form.submit.data and update_notifications_form.validate():
        user.setting_job_status_mail_notification_level = \
            update_notifications_form.job_status_mail_notification_level.data
        db.session.commit()
        flash('Your changes have been saved')
        return redirect(url_for('.user_settings', user_id=user.id))
    # endregion handle update notifications form

    # region handle update user form
    if update_user_form.submit.data and update_user_form.validate():
        role_id = hashids.decode(update_user_form.role.data)
        user.role = Role.query.get(role_id)
        db.session.commit()
        flash('Your changes have been saved')
        return redirect(url_for('.user_settings', user_id=user.id))
    # endregion handle update user form

    return render_template(
        'admin/user_settings.html.j2',
        title='Settings',
        update_account_information_form=update_account_information_form,
        update_avatar_form=update_avatar_form,
        update_notifications_form=update_notifications_form,
        update_password_form=update_password_form,
        update_profile_information_form=update_profile_information_form,
        update_user_form=update_user_form,
        user=user
    )