"""
File Upload Model
Database model for tracking uploaded files
"""
from sqlalchemy import Column, Integer, String, DateTime, BigInteger, Text, Enum as SQLEnum, ForeignKey
from sqlalchemy.orm import relationship
from datetime import datetime
import enum

from app.database import Base


class FileStatus(str, enum.Enum):
    """File status"""
    PENDING = "pending"
    UPLOADED = "uploaded"
    PROCESSING = "processing"
    READY = "ready"
    FAILED = "failed"
    DELETED = "deleted"


class FileUpload(Base):
    """File upload tracking model"""
    __tablename__ = "file_uploads"

    id = Column(Integer, primary_key=True, index=True)

    # Client association
    client_id = Column(Integer, ForeignKey("clients.id"), nullable=True, index=True)

    # File info
    original_filename = Column(String(255), nullable=False)
    stored_filename = Column(String(255), nullable=False)
    content_type = Column(String(100), nullable=False)
    file_size = Column(BigInteger, nullable=False)  # In bytes

    # Storage info
    storage_provider = Column(String(20), nullable=False)  # s3, cloudinary, local
    storage_key = Column(String(500), nullable=False, index=True)  # S3 key or Cloudinary public_id
    storage_url = Column(Text, nullable=True)  # Public URL if available

    # Category/Organization
    category = Column(String(50), default="attachments")  # avatars, documents, images, etc.

    # Security
    checksum_md5 = Column(String(32), nullable=True)  # MD5 hash for integrity

    # Metadata
    metadata_json = Column(Text, nullable=True)  # JSON string of additional metadata
    alt_text = Column(String(500), nullable=True)  # Alt text for images
    description = Column(Text, nullable=True)

    # Status
    status = Column(SQLEnum(FileStatus), default=FileStatus.UPLOADED)

    # Timestamps
    created_at = Column(DateTime, default=datetime.utcnow)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    deleted_at = Column(DateTime, nullable=True)

    # Uploaded by (User reference)
    uploaded_by_user_id = Column(Integer, ForeignKey("users.id"), nullable=True)

    # Relationships
    client = relationship("Client", backref="uploaded_files")
    uploaded_by = relationship("User", backref="uploaded_files")

    def __repr__(self):
        return f"<FileUpload {self.id}: {self.original_filename}>"

    @property
    def file_extension(self) -> str:
        """Get file extension"""
        if '.' in self.original_filename:
            return self.original_filename.rsplit('.', 1)[1].lower()
        return ''

    @property
    def is_image(self) -> bool:
        """Check if file is an image"""
        return self.content_type.startswith('image/')

    @property
    def is_document(self) -> bool:
        """Check if file is a document"""
        doc_types = ['application/pdf', 'application/msword', 'text/', 'application/vnd.']
        return any(self.content_type.startswith(t) for t in doc_types)

    @property
    def size_formatted(self) -> str:
        """Get formatted file size"""
        size = self.file_size
        for unit in ['B', 'KB', 'MB', 'GB']:
            if size < 1024:
                return f"{size:.1f} {unit}"
            size /= 1024
        return f"{size:.1f} TB"


class FileUploadBatch(Base):
    """Batch upload tracking for multiple files"""
    __tablename__ = "file_upload_batches"

    id = Column(Integer, primary_key=True, index=True)

    # Client association
    client_id = Column(Integer, ForeignKey("clients.id"), nullable=True, index=True)

    # Batch info
    batch_id = Column(String(50), unique=True, index=True)  # UUID
    total_files = Column(Integer, default=0)
    uploaded_files = Column(Integer, default=0)
    failed_files = Column(Integer, default=0)

    # Status
    status = Column(String(20), default="pending")  # pending, uploading, completed, failed

    # Timestamps
    created_at = Column(DateTime, default=datetime.utcnow)
    completed_at = Column(DateTime, nullable=True)

    # Uploaded by
    uploaded_by_user_id = Column(Integer, ForeignKey("users.id"), nullable=True)

    def __repr__(self):
        return f"<FileUploadBatch {self.batch_id}: {self.uploaded_files}/{self.total_files}>"
