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

class DownloadFile(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(200), nullable=False)
    description = db.Column(db.Text, nullable=True)
    file_type = db.Column(db.String(50), nullable=False)  # installer, manual, update
    version = db.Column(db.String(50), nullable=False)
    file_path = db.Column(db.String(500), nullable=False)
    file_size = db.Column(db.Integer, nullable=False)  # 바이트 단위
    download_count = db.Column(db.Integer, default=0)
    is_latest = db.Column(db.Boolean, default=False)
    is_active = db.Column(db.Boolean, default=True)
    created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    
    # 관계 설정
    download_logs = db.relationship('DownloadLog', backref='file', lazy=True)

    def __repr__(self):
        return f'<DownloadFile {self.name}>'

    def to_dict(self):
        return {
            'id': self.id,
            'name': self.name,
            'description': self.description,
            'file_type': self.file_type,
            'version': self.version,
            'file_path': self.file_path,
            'file_size': self.file_size,
            'download_count': self.download_count,
            'is_latest': self.is_latest,
            'is_active': self.is_active,
            'created_at': self.created_at.isoformat() if self.created_at else None
        }

class DownloadLog(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    file_id = db.Column(db.Integer, db.ForeignKey('download_file.id'), nullable=False)
    user_id = db.Column(db.String(20), nullable=True)  # 비회원도 다운로드 가능
    ip_address = db.Column(db.String(45), nullable=False)  # IPv6 지원
    user_agent = db.Column(db.String(500), nullable=True)
    downloaded_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
    
    # 관계 설정
    user = db.relationship(
        'User', backref=db.backref('download_logs', lazy=True),
        primaryjoin='DownloadLog.user_id==User.user_id',
        foreign_keys='DownloadLog.user_id',
    )

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

    def to_dict(self):
        return {
            'id': self.id,
            'file_id': self.file_id,
            'user_id': self.user_id,
            'username': self.user.username if self.user else 'Anonymous',
            'ip_address': self.ip_address,
            'user_agent': self.user_agent,
            'downloaded_at': self.downloaded_at.isoformat() if self.downloaded_at else None
        }

