class Groups(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    num_mem = db.Column(db.Integer)
    creator = db.Column(db.String(100))
    when = db.Column(db.DateTime, default=datetime.utcnow, index=True)
    description = db.Column(db.String(200))
    transactions = db.relationship('Group_transactions',
                                   backref='group',
                                   lazy='dynamic',
                                   cascade="all,delete")
    members = db.relationship('User',
                              secondary=group_helper_table,
                              backref=db.backref('groups', lazy='dynamic'),
                              lazy='dynamic')

    def add_mem(self, user):
        if not self.is_mem(user):
            self.members.append(user)
            #user.groups.append(self)
            db.session.commit()
        else:
            flash('Already member')

    def remove_mem(self, user):
        if self.is_mem(user):
            self.members.remove(user)
            #user.groups.remove(self)
            db.session.commit()

    def is_mem(self, user):
        return self.members.filter(
            group_helper_table.c.userID == user.id).count() > 0
class Tpay(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    transaction_id = db.Column(db.Integer,
                               db.ForeignKey('group_transactions.id'))
    p = db.Column(db.String(150), db.ForeignKey('user.id'))
    amount = db.Column(db.Float)
    payer = db.relationship('User',
                            foreign_keys=p,
                            backref=db.backref('group_me_pay',
                                               lazy='dynamic',
                                               cascade="all,delete"))
    transid = db.relationship('Group_transactions',
                              foreign_keys=transaction_id,
                              backref=db.backref('payers',
                                                 lazy='dynamic',
                                                 cascade="all,delete"))
class Group_settle(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    giverID = db.Column(db.Integer, db.ForeignKey('user.id'))
    receiverID = db.Column(db.Integer, db.ForeignKey('user.id'))
    amt = db.Column(db.Float)
    groupID = db.Column(db.Integer, db.ForeignKey('group_transactions.id'))

    giver = db.relationship('User',
                            foreign_keys=giverID,
                            backref=db.backref('g_pay', lazy='dynamic'))
    receiver = db.relationship('User',
                               foreign_keys=receiverID,
                               backref=db.backref('g_receive', lazy='dynamic'))
    group = db.relationship('Group_transactions',
                            foreign_keys=groupID,
                            backref=db.backref('neededtrans', lazy='dynamic'))
class Balance(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    payerID = db.Column(db.Integer, db.ForeignKey('user.id'))
    receiverID = db.Column(db.Integer, db.ForeignKey('user.id'))
    balance = db.Column(db.Float)
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)

    payer = db.relationship('User',
                            foreign_keys=payerID,
                            backref=db.backref('pay', lazy='dynamic'))
    receiver = db.relationship('User',
                               foreign_keys=receiverID,
                               backref=db.backref('receive', lazy='dynamic'))

    def __repr__(self):
        return '{} owes {} --> {}'.format(self.payer.username,
                                          self.receiver.username, self.balance)
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), index=True)
    username = db.Column(db.String(100), index=True, unique=True)
    email = db.Column(db.String(150), index=True, unique=True)
    pno = db.Column(db.String(20), index=True, unique=True)
    password = db.Column(db.String(100))
    city = db.Column(db.String(50))
    dob = db.Column(db.Date)
    gender = db.Column(db.String)
    friends = db.relationship('User',
                              secondary=friends,
                              primaryjoin=(friends.c.userID == id),
                              secondaryjoin=(friends.c.friendID == id),
                              lazy='dynamic')

    def __repr__(self):
        return 'Username:{} ID:{}'.format(self.username, self.id)

    def add_friend(self, user):
        if not self.is_friend(user):
            self.friends.append(user)
            user.friends.append(self)
            db.session.commit()
        else:
            flash('Already friends')

    def remove_friend(self, user):
        if self.is_friend(user):
            self.friends.remove(user)
            user.friends.remove(self)
            db.session.commit()

    def is_friend(self, user):
        return self.friends.filter(friends.c.friendID == user.id).count() > 0

    def set_password(self, pswd):
        self.password = generate_password_hash(pswd)

    def check_password(self, pswd):
        return check_password_hash(self.password, pswd)