from datetime import datetime
from zoneinfo import ZoneInfo

from app.models import db


class Media(db.Model):
    """
    媒体模型类，表示数据库中的 'media' 表。

    该类存储与用户相关联的媒体的基本信息，如文件名、路径、文件类型、分辨率等。
    媒体可以是图片或视频，并关联到用户。每个媒体只能属于一个用户，且可进行状态管理。

    Attributes:
        media_id (int): 媒体的唯一标识符（主键）。
        media_name (str): 媒体名称，必须唯一，不能为空。
        media_path (str): 媒体存储路径，必须唯一，不能为空。
        description (str): 媒体的描述信息（可选）。
        file_size (int): 媒体的大小（字节）。
        file_type (str): 媒体的类型，通常为图片或视频。
        resolution_width (int): 媒体的宽度（像素）。
        resolution_height (int): 媒体的高度（像素）。
        frame_count (int): 媒体的帧数（图片为 1，视频为实际帧数）。
        upload_at (datetime): 媒体的上传时间，默认为当前时间。
        updated_at (datetime): 媒体的最后更新时间，默认为当前时间，并在更新时自动更新。
        owner_id (int): 所属用户的唯一标识符（外键）。

    Relationships:
        owner (User): 一个媒体只属于一个用户，表示该媒体的所有者。
        detections (Detection): 一个媒体可以有多个检测分割记录（反向关系，表示该媒体参与的所有检测任务）。
    """
    __tablename__ = 'media'

    media_id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 媒体 ID
    media_name = db.Column(db.String(255), unique=True, nullable=False)  # 媒体名称
    media_path = db.Column(db.String(255), unique=True, nullable=False)  # 媒体存储路径
    description = db.Column(db.Text, default='暂无描述')  # 媒体描述
    file_size = db.Column(db.Float, default=0.0)  # 文件大小（KB）
    file_type = db.Column(db.String(50), nullable=False)  # 文件类型（图片或视频）
    resolution_width = db.Column(db.Integer, default=0)  # 分辨率宽度
    resolution_height = db.Column(db.Integer, default=0)  # 分辨率高度
    frame_count = db.Column(db.Integer, default=1, nullable=False)  # 帧数（图片为 1，视频为实际帧数）
    upload_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai")))  # 上传时间
    updated_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai")),
                           onupdate=lambda: datetime.now(ZoneInfo("Asia/Shanghai")))  # 最后更新时间
    owner_id = db.Column(db.Integer, db.ForeignKey('user.user_id'), nullable=False)  # 所属用户 ID（外键）

    # 设置与 User 表的关系：一份媒体文件只属于一个用户
    owner = db.relationship('User', backref=db.backref('medias', lazy=True))

    def __repr__(self):
        return (f"Media(media_id={self.media_id}, "
                f"media_name={self.media_name}, "
                f"media_path={self.media_path}, "
                f"description={self.description}, "
                f"file_size={self.file_size}, "
                f"file_type={self.file_type}, "
                f"resolution_width={self.resolution_width}, "
                f"resolution_height={self.resolution_height}, "
                f"frame_count={self.frame_count}, "
                f"upload_at={self.upload_at}, "
                f"updated_at={self.updated_at}, "
                f"owner_id={self.owner_id})")

    def to_dict(self):
        """
        将 Media 实例转化为字典。
        """
        return {
            'media_id': self.media_id,
            'media_name': self.media_name,
            'media_path': self.media_path,
            'description': self.description,
            'file_size': self.file_size,
            'file_type': self.file_type,
            'resolution_width': self.resolution_width,
            'resolution_height': self.resolution_height,
            'frame_count': self.frame_count,
            'upload_at': self.upload_at,
            'updated_at': self.updated_at,
            'owner_id': self.owner_id
        }
