from app.utils.priv_required import priv_required
from flask_wtf import FlaskForm
from wtforms import SubmitField
from app.models.users import Member, Group, GroupPrivilege
from app.models.privs import SpecialPrivilege
from app.utils.render import render
from app import app, db
import yaml
import os


@app.route('/admin/groups', methods=['GET', 'POST'])
@priv_required('access-admin-panel')
def adm_groups():
    class GroupRegenerationForm(FlaskForm):
        submit = SubmitField(
            'Régénérer les groupes, privilèges, et comptes communs')

    form = GroupRegenerationForm()
    if form.validate_on_submit():
        # Clean up groups
        for g in Group.query.all():
            g.delete()

        # Create base groups
        groups = []
        with open(os.path.join(app.root_path, "data", "groups.yaml")) as fp:
            groups = yaml.load(fp.read())

        for g in groups:
            g["obj"] = Group(g["name"], g["css"], g["descr"])
            db.session.add(g["obj"])
        db.session.commit()

        for g in groups:
            for priv in g.get("privs", "").split():
                db.session.add(GroupPrivilege(g["obj"], priv))
        db.session.commit()

        # Clean up test members
        for name in "PlanèteCasio GLaDOS".split():
            m = Member.query.filter_by(name=name).first()
            if m is not None:
                m.delete()

        # Create template members

        def addgroup(member, group):
            g = Group.query.filter_by(name=group).first()
            if g is not None:
                member.groups.append(g)

        m = Member('PlanèteCasio', 'contact@planet-casio.com', 'v5-forever')
        addgroup(m, "Compte communautaire")
        db.session.add(m)

        m = Member('GLaDOS', 'glados@aperture.science', 'v5-forever')
        m.xp = 1337
        addgroup(m, "Robot")
        db.session.add(m)
        db.session.commit()

        db.session.add(SpecialPrivilege(m, "edit-posts"))
        db.session.add(SpecialPrivilege(m, "shoutbox-ban"))

        db.session.commit()

    users = Member.query.all()
    groups = Group.query.all()

    return render('admin/groups_privileges.html', users=users, groups=groups,
        form=form)
