from datetime import datetime
from app import db, login
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash

followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)

channel_association = db.Table('channel_association',
    db.Column('channel_id', db.String, db.ForeignKey('channel.id')),
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'))
) # Association: CHANNEL --followed by--> [USERS]

twitter_association = db.Table('twitter_association',
    db.Column('account_id', db.String, db.ForeignKey('twitterAccount.id')),
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'))
) # Association: ACCOUNT --followed by--> [USERS]

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    posts = db.relationship('Post', backref='author', lazy='dynamic')

    def __repr__(self):
        return '<User {}>'.format(self.username)

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

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)
    
    def follow(self, user):
        if not self.is_following(user):
            self.followed.append(user)

    def unfollow(self, user):
        if self.is_following(user):
            self.followed.remove(user)

    def is_following(self, user):
        return self.followed.filter(
            followers.c.followed_id == user.id).count() > 0
    
    def following_list(self):
        return self.followed.all()

    def saved_posts(self):
        return Post.query.filter_by(user_id=self.id)

    # TWITTER
    def twitter_following_list(self):
        return self.twitterFollowed.all()
    
    def is_following_tw(self, uname):
        temp_cid = twitterFollow.query.filter_by(username = uname).first()
        if temp_cid is None:
            return False
        else:
            following = self.twitter_following_list()
            for f in following:
                if f.username == uname:
                    return True
        return False
    
    # YOUTUBE
    def youtube_following_list(self):
        return self.youtubeFollowed.all()
    
    def is_following_yt(self, cid):
        temp_cid = youtubeFollow.query.filter_by(channelId = cid).first()
        if temp_cid is None:
            return False
        else:
            following = self.youtube_following_list()
            for f in following:
                if f.channelId == cid:
                    return True
        return False
        
    followed = db.relationship(
        'User', secondary=followers,
        primaryjoin=(followers.c.follower_id == id),
        secondaryjoin=(followers.c.followed_id == id),
        backref=db.backref('followers', lazy='dynamic'), lazy='dynamic')

    youtubeFollowed = db.relationship("youtubeFollow",
        secondary=channel_association,
        back_populates="followers",
        lazy='dynamic')

    twitterFollowed = db.relationship("twitterFollow",
        secondary=twitter_association,
        back_populates="followers",
        lazy='dynamic')


@login.user_loader
def load_user(id):
    return User.query.get(int(id))

class twitterPost():
    date = 0
    username = 'Error'
    twitterName = "Error Name"
    isPinned = False
    op = 'Error'
    isRT = True
    urlToPost = ""
    validPost = True
    content = ""
    profilePic = "url"
    timeStamp = "error"
    userProfilePic = "1.png"
    isReply = False
    replyingUrl = "#"
    replyingUser = "@nobody"
    replyingTweetContent = ""
    attachedImg = ""
    replyAttachedImg = ""

class ytPost():
    channelName = 'Error'
    channelUrl = '#'
    channelId = '@'
    videoUrl = '#'
    videoTitle = '#'
    videoThumb = '#'
    description = "LOREM IPSUM"
    date = 'None'
    views = 'NaN'
    id = 'isod'


class youtubeFollow(db.Model):
    __tablename__ = 'channel'
    id = db.Column(db.Integer, primary_key=True)
    channelId = db.Column(db.String(30), nullable=False)
    channelName = db.Column(db.String(30))
    followers = db.relationship('User', 
                                secondary=channel_association,
                                back_populates="youtubeFollowed")
    
    def __repr__(self):
        return '<youtubeFollow {}>'.format(self.channelName)

class twitterFollow(db.Model):
    __tablename__ = 'twitterAccount'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(30), nullable=False)
    followers = db.relationship('User', 
                                secondary=twitter_association,
                                back_populates="twitterFollowed")
    
    def __repr__(self):
        return '<twitterFollow {}>'.format(self.username)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(140))
    timestamp = db.Column(db.String(100))
    url = db.Column(db.String(100), unique=True)
    username = db.Column(db.String(24))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Post {}>'.format(self.body)