from datetime import datetime

from sqlalchemy import Column, DateTime, Integer, String, ForeignKey
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import relationship

from src.core.models.base import Base
from src.apps.files.models.cdn import CDN


class File(Base):
    """
    Database model for uploaded files.
    """

    __tablename__ = "files"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    original_name = Column(String(255), nullable=False, comment="Original file name before upload/rename")
    name = Column(String(255), nullable=False, comment="Stored file name (after renaming, if any)")
    path = Column(String(255), nullable=False, comment="File path in storage")
    mime = Column(String(100), nullable=True, comment="MIME type of the file")
    cdn_id = Column(Integer, ForeignKey("cdns.id"), nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False, comment="Upload timestamp")
    created_by_id = Column(Integer, nullable=False, comment="Uploader's user ID")


    cdn = relationship("CDN")  # Relationship to CDN
    
    @hybrid_property
    def full_url(self) -> str:
        """
        Returns the file's accessible URL. Here we just return the path directly,
        or you can adjust it to prepend a static host if needed.
        """
        return self.path.replace("\\", "/")

    # @hybrid_property
    # def full_url(self):
    #     return f"{self.cdn.host}/{self.path.replace('\\', '/')}" if self.cdn else None
    
    def __repr__(self):
        return (
            f"<File(id={self.id}, original_name={self.original_name}, name={self.name}, "
            f"path={self.path}, mime={self.mime})>"
        )
