"""Document models for file uploads and storage."""

from datetime import datetime
from enum import Enum as PyEnum
from uuid import uuid4

from sqlalchemy import Boolean, Column, DateTime, Enum, ForeignKey, Integer, String, Text
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship

from app.database import Base


class DocumentType(str, PyEnum):
    """Document type."""
    ID_CARD = "id_card"
    PASSPORT = "passport"
    BIRTH_CERTIFICATE = "birth_certificate"
    WAEC_RESULT = "waec_result"
    TRANSCRIPT = "transcript"
    CERTIFICATE = "certificate"
    ADMISSION_LETTER = "admission_letter"
    OTHER = "other"


class DocumentStatus(str, PyEnum):
    """Document verification status."""
    PENDING = "pending"
    VERIFIED = "verified"
    REJECTED = "rejected"


class Document(Base):
    """Document upload record."""
    __tablename__ = "documents"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True, index=True)
    application_id = Column(UUID(as_uuid=True), ForeignKey("applications.id"), nullable=True, index=True)
    
    document_type = Column(Enum(DocumentType), nullable=False, index=True)
    file_name = Column(String(255), nullable=False)
    file_url = Column(String(500), nullable=False)  # URL to file in storage (ImageKit/S3)
    file_size = Column(Integer, nullable=True)  # Size in bytes
    mime_type = Column(String(100), nullable=True)  # e.g., "application/pdf", "image/jpeg"
    
    # Verification
    status = Column(Enum(DocumentStatus), default=DocumentStatus.PENDING, nullable=False, index=True)
    verified_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True)
    verified_at = Column(DateTime, nullable=True)
    verification_notes = Column(Text, nullable=True)
    
    # Metadata
    description = Column(Text, nullable=True)
    
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    
    # Relationships
    user = relationship("User", foreign_keys=[user_id])
    application = relationship("Application", foreign_keys=[application_id])
    verifier = relationship("User", foreign_keys=[verified_by])

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