# -*- coding: utf-8 -*-

from flamejam import app, db, mail
from flamejam.models import Invitation, Game
from flask import url_for, render_template

class Team(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    jam_id = db.Column(db.Integer, db.ForeignKey("jam.id"))
    name = db.Column(db.String(80))

    description = db.Column(db.Text)
    livestreams = db.Column(db.Text) # list of livestreams, one URL per file
    irc = db.Column(db.String(128))

    participations = db.relationship("Participation", backref = "team", lazy = "subquery")
    invitations = db.relationship("Invitation", backref = "team", lazy = "subquery")
    games = db.relationship("Game", backref = "team", lazy = "subquery")

    def __init__(self, user, jam):
        self.jam = jam
        self.userJoin(user)
        self.name = user.username + "'s team"

    @property
    def members(self):
        return [r.user for r in self.participations]

    @property
    def game(self):
        return self.games[0] if self.games else None

    @property
    def isSingleTeam(self):
        return len(self.participations) == 1

    def url(self, **values):
        return url_for("jam_team", jam_slug = self.jam.slug, team_id = self.id, **values)

    def userJoin(self, user):
        r = user.getParticipation(self.jam)
        if not r:
            # register user, but do not create automatic team, we don't need
            # that anyway
            user.joinJam(self.jam, False)
        elif r in self.participations:
            return # user is already in this team
        elif r.team and r.team != self:
            r.team.userLeave(user)

        r.team = self
        db.session.commit()

    def userLeave(self, user):
        r = user.getParticipation(self.jam)

        if r.team != self:
            return # not in this team, nevermind ;)

        if self.isSingleTeam:
            # only user in team, we can destroy this team
            self.destroy()

        r.team = None
        db.session.commit()

    def destroy(self):
        # also destroy all the games, invitations
        for game in self.games:
            game.destroy()
        for invitation in self.invitations:
            db.session.delete(invitation)
        db.session.delete(self)

    @property
    def numberMembersAndInvitations(self):
        return len(self.members) + len(self.invitations)

    def canInvite(self, user):
        return user in self.members and (self.jam.team_limit == 0 or self.jam.team_limit > self.numberMembersAndInvitations)

    def getInvitation(self, user):
        return Invitation.query.filter_by(user_id = user.id, team_id = self.id).first()

    def inviteUser(self, user, sender): # sender: which user sent the invitation
        if not user.notify_team_invitation:
            return None

        if self.getInvitation(user):
            i = self.getInvitation(user) # already invited
        else:
            i = Invitation(self, user)
            db.session.add(i)
            db.session.commit()
            body = render_template("emails/invitation.txt", team=self, sender=sender, recipient=user, invitation=i)
            mail.send_message(subject=app.config["LONG_NAME"] +": You have been invited to " + self.name, recipients=[user.email], body=body)
        return i

