from flask_sqlalchemy import SQLAlchemy
from datetime import datetime, timezone
from src.models.user import db

class SnsPost(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text, nullable=False)
    author_id = db.Column(db.String(20), nullable=False)  # User.user_id
    image_urls = db.Column(db.Text, nullable=True)  # JSON 형태로 저장
    hashtags = db.Column(db.Text, nullable=True)  # JSON 형태로 저장
    created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    updated_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc))
    
    # 관계 설정
    author = db.relationship(
        'User', backref=db.backref('sns_posts', lazy=True),
        primaryjoin='SnsPost.author_id==User.user_id',
        foreign_keys='SnsPost.author_id',
    )
    likes = db.relationship('SnsLike', backref='post', lazy=True, cascade='all, delete-orphan')
    comments = db.relationship('SnsComment', backref='post', lazy=True, cascade='all, delete-orphan')

    def __repr__(self):
        return f'<SnsPost {self.id}>'

    def to_dict(self):
        import json
        return {
            'id': self.id,
            'content': self.content,
            'author_id': self.author_id,
            'author_username': self.author.username if self.author else None,
            'image_urls': json.loads(self.image_urls) if self.image_urls else [],
            'hashtags': json.loads(self.hashtags) if self.hashtags else [],
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None,
            'like_count': len(self.likes),
            'comment_count': len(self.comments)
        }

class SnsLike(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    post_id = db.Column(db.Integer, db.ForeignKey('sns_post.id'), nullable=False)
    user_id = db.Column(db.String(20), nullable=False)
    created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    
    # 관계 설정
    user = db.relationship(
        'User', backref=db.backref('sns_likes', lazy=True),
        primaryjoin='SnsLike.user_id==User.user_id',
        foreign_keys='SnsLike.user_id',
    )
    
    # 중복 좋아요 방지
    __table_args__ = (db.UniqueConstraint('post_id', 'user_id', name='unique_post_user_like'),)

    def __repr__(self):
        return f'<SnsLike {self.id}>'

    def to_dict(self):
        return {
            'id': self.id,
            'post_id': self.post_id,
            'user_id': self.user_id,
            'username': self.user.username if self.user else None,
            'created_at': self.created_at.isoformat() if self.created_at else None
        }

class SnsComment(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text, nullable=False)
    post_id = db.Column(db.Integer, db.ForeignKey('sns_post.id'), nullable=False)
    author_id = db.Column(db.String(20), nullable=False)  # User.user_id
    parent_id = db.Column(db.Integer, db.ForeignKey('sns_comment.id'), nullable=True)  # 대댓글용
    created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    
    # 관계 설정
    author = db.relationship(
        'User', backref=db.backref('sns_comments', lazy=True),
        primaryjoin='SnsComment.author_id==User.user_id',
        foreign_keys='SnsComment.author_id',
    )
    replies = db.relationship('SnsComment', backref=db.backref('parent', remote_side=[id]), lazy=True)

    def __repr__(self):
        return f'<SnsComment {self.id}>'

    def to_dict(self):
        return {
            'id': self.id,
            'content': self.content,
            'post_id': self.post_id,
            'author_id': self.author_id,
            'author_username': self.author.username if self.author else None,
            'parent_id': self.parent_id,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'replies': [reply.to_dict() for reply in self.replies]
        }

class Follow(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    follower_id = db.Column(db.String(20), nullable=False)  # 팔로우하는 사람 User.user_id
    following_id = db.Column(db.String(20), nullable=False)  # 팔로우당하는 사람
    created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    
    # 관계 설정
    follower = db.relationship(
        'User', foreign_keys=[follower_id],
        primaryjoin='Follow.follower_id==User.user_id',
        backref=db.backref('following', lazy=True),
    )
    following = db.relationship(
        'User', foreign_keys=[following_id],
        primaryjoin='Follow.following_id==User.user_id',
        backref=db.backref('followers', lazy=True),
    )
    
    # 중복 팔로우 방지
    __table_args__ = (db.UniqueConstraint('follower_id', 'following_id', name='unique_follow'),)

    def __repr__(self):
        return f'<Follow {self.follower_id} -> {self.following_id}>'

    def to_dict(self):
        return {
            'id': self.id,
            'follower_id': self.follower_id,
            'following_id': self.following_id,
            'follower_username': self.follower.username if self.follower else None,
            'following_username': self.following.username if self.following else None,
            'created_at': self.created_at.isoformat() if self.created_at else None
        }

