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

class ChatRoom(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=True)  # 그룹 채팅방 이름 (1:1 채팅은 null)
    is_private = db.Column(db.Boolean, default=True)  # True: 1:1 채팅, False: 공개 채팅방
    created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    
    # 관계 설정
    messages = db.relationship('ChatMessage', backref='room', lazy=True, cascade='all, delete-orphan')
    participants = db.relationship('ChatParticipant', backref='room', lazy=True, cascade='all, delete-orphan')

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

    def to_dict(self):
        return {
            'id': self.id,
            'name': self.name,
            'is_private': self.is_private,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'participant_count': len(self.participants),
            'last_message': self.messages[-1].to_dict() if self.messages else None
        }

class ChatParticipant(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    room_id = db.Column(db.Integer, db.ForeignKey('chat_room.id'), nullable=False)
    user_id = db.Column(db.String(20), nullable=False)
    joined_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    last_read_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    
    # 관계 설정
    user = db.relationship(
        'User', backref=db.backref('chat_participations', lazy=True),
        primaryjoin='ChatParticipant.user_id==User.user_id',
        foreign_keys='ChatParticipant.user_id',
    )

    def __repr__(self):
        return f'<ChatParticipant {self.user_id} in {self.room_id}>'

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

class ChatMessage(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    room_id = db.Column(db.Integer, db.ForeignKey('chat_room.id'), nullable=False)
    sender_id = db.Column(db.String(20), nullable=False)
    content = db.Column(db.Text, nullable=False)
    message_type = db.Column(db.String(20), default='text')  # text, image, file
    file_url = db.Column(db.String(500), nullable=True)  # 파일/이미지 URL
    created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    
    # 관계 설정
    sender = db.relationship(
        'User', backref=db.backref('sent_messages', lazy=True),
        primaryjoin='ChatMessage.sender_id==User.user_id',
        foreign_keys='ChatMessage.sender_id',
    )

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

    def to_dict(self):
        return {
            'id': self.id,
            'room_id': self.room_id,
            'sender_id': self.sender_id,
            'sender_username': self.sender.username if self.sender else None,
            'content': self.content,
            'message_type': self.message_type,
            'file_url': self.file_url,
            'created_at': self.created_at.isoformat() if self.created_at else None
        }

