from flask_login import current_user
from flask import redirect, url_for, flash, abort
from sqlalchemy import desc

from app import app, db
from config import V5Config
from app.utils.render import render
from app.forms.forum import CommentForm, AnonymousCommentForm
from app.models.thread import Thread
from app.models.comment import Comment
from app.models.user import Guest
from app.models.attachment import Attachment

from datetime import datetime


@app.route('/forum/<forum:f>/<topicpage:page>', methods=['GET', 'POST'])
def forum_topic(f, page):
    t, page = page

    if not f.is_default_accessible() and not (
        current_user.is_authenticated and current_user.can_access_forum(f)):
        abort(403)

    # Quick n' dirty workaround to converters
    if f != t.forum:
        abort(404)

    if current_user.is_authenticated:
        form = CommentForm()
    else:
        form = AnonymousCommentForm()

    if form.validate_on_submit() and (
        V5Config.ENABLE_GUEST_POST or \
        (current_user.is_authenticated and current_user.can_post_in_forum(f))):

        # Manage author
        if current_user.is_authenticated:
            author = current_user
        else:
            author = Guest(form.pseudo.data)
            db.session.add(author)

        # Create comment
        c = Comment(author, form.message.data, t.thread)
        db.session.add(c)
        db.session.commit()
        c.create_attachments(form.attachments.data)

        # Update member's xp and trophies
        if current_user.is_authenticated:
            current_user.add_xp(1)  # 1 point for a comment
            current_user.update_trophies('new-post')

        flash('Message envoyé', 'ok')
        # Redirect to empty the form
        return redirect(url_for('forum_topic', f=f, page=(t, "fin"),
            _anchor=c.id))

    # Update views
    t.views += 1
    db.session.merge(t)
    db.session.commit()

    if page == -1:
        page = (t.thread.comments.count() - 1) // Thread.COMMENTS_PER_PAGE + 1

    comments = t.thread.comments.order_by(Comment.date_created.asc()) \
        .paginate(page, Thread.COMMENTS_PER_PAGE, True)

    # Anti-necropost
    last_com = t.thread.comments.order_by(desc(Comment.date_modified)).first()
    inactive = datetime.now() - last_com.date_modified
    outdated = inactive.days if inactive >= V5Config.NECROPOST_LIMIT else None

    return render('/forum/topic.html', t=t, form=form, comments=comments,
        outdated=outdated)
