import uuid from datetime import datetime from sqlalchemy import String, DateTime, JSON, Float, ForeignKey, func, Integer from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.dialects.postgresql import UUID from ..database import Base class MatchResult(Base): __tablename__ = "match_results" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) jd_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("job_descriptions.id", ondelete="CASCADE"), index=True) candidate_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("candidates.id", ondelete="CASCADE"), index=True) session_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), ForeignKey("sessions.id", ondelete="CASCADE"), nullable=True, index=True) rank: Mapped[int | None] = mapped_column(nullable=True) stage1_score: Mapped[float] = mapped_column(Float, default=0.0) stage2_score: Mapped[float | None] = mapped_column(Float, nullable=True) final_score: Mapped[float] = mapped_column(Float, default=0.0) component_scores: Mapped[dict] = mapped_column(JSON, default=dict) gaps: Mapped[list] = mapped_column(JSON, default=list) explanation: Mapped[str | None] = mapped_column(String, nullable=True) explanation_generated_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) weights_used: Mapped[dict] = mapped_column(JSON, default=dict) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())