"""
Document model for storing client documents and attachments.
"""
import enum
from sqlalchemy import Column, Integer, String, Enum, ForeignKey, Boolean, BigInteger
from sqlalchemy.orm import relationship

from app.models.base import BaseModel


class DocumentType(str, enum.Enum):
    """Document type classification."""
    ID_CARD = "id_card"  # Carte d'identité
    PASSPORT = "passport"  # Passeport
    DRIVING_LICENSE = "driving_license"  # Permis de conduire
    VISA = "visa"  # Visa
    BIRTH_CERTIFICATE = "birth_certificate"  # Acte de naissance
    MARRIAGE_CERTIFICATE = "marriage_certificate"  # Acte de mariage
    OTHER = "other"  # Autre


class Document(BaseModel):
    """
    Document storage for client attachments.

    Stores metadata about uploaded documents (identity documents, etc.).
    Actual files are stored on disk or cloud storage.

    Attributes:
        client_id: Associated client
        document_type: Type of document
        file_name: Original file name
        file_path: Relative path to stored file
        file_size: File size in bytes
        mime_type: MIME type of the file
        description: Optional description
        is_verified: Whether document has been verified
        verified_by_id: User who verified the document
    """
    __tablename__ = "documents"

    client_id = Column(Integer, ForeignKey("clients.id", ondelete="CASCADE"), nullable=False, index=True)
    document_type = Column(Enum(DocumentType), nullable=False, index=True)

    # File information
    file_name = Column(String(255), nullable=False)
    file_path = Column(String(500), nullable=False)  # Relative path from upload directory
    file_size = Column(BigInteger, nullable=False)  # Size in bytes
    mime_type = Column(String(100), nullable=False)

    # Metadata
    description = Column(String(500), nullable=True)
    is_verified = Column(Boolean, default=False, nullable=False)
    verified_by_id = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"), nullable=True)

    # Relationships
    client = relationship("Client", back_populates="documents")
    verified_by = relationship("User", foreign_keys=[verified_by_id])

    def __repr__(self) -> str:
        return f"<Document {self.file_name} ({self.document_type})>"
