from datetime import datetime, timezone from sqlalchemy import DateTime, ForeignKey, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.database.database import Base class OnboardingSession(Base): __tablename__ = "onboarding_sessions" id: Mapped[int] = mapped_column( Integer, primary_key=True, autoincrement=True, ) session_id: Mapped[str] = mapped_column( String(50), unique=True, nullable=False, index=True, ) patient_id: Mapped[str] = mapped_column( String(100), nullable=False, index=True, ) patient_name: Mapped[str | None] = mapped_column( String(255), nullable=True, ) age: Mapped[int | None] = mapped_column( Integer, nullable=True, ) gender: Mapped[str | None] = mapped_column( String(50), nullable=True, ) category_type: Mapped[str] = mapped_column( String(50), nullable=False, ) category_code: Mapped[str] = mapped_column( String(100), nullable=False, ) category_name: Mapped[str] = mapped_column( String(255), nullable=False, ) language: Mapped[str] = mapped_column( String(20), default="en", nullable=False, ) status: Mapped[str] = mapped_column( String(50), default="in_progress", nullable=False, ) stage: Mapped[str] = mapped_column( String(100), default="greeting", nullable=False, ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), nullable=False, ) class OnboardingMessage(Base): __tablename__ = "onboarding_messages" id: Mapped[int] = mapped_column( Integer, primary_key=True, autoincrement=True, ) session_id: Mapped[str] = mapped_column( String(50), ForeignKey("onboarding_sessions.session_id"), nullable=False, index=True, ) role: Mapped[str] = mapped_column( String(20), nullable=False, ) message: Mapped[str] = mapped_column( Text, nullable=False, ) stage: Mapped[str] = mapped_column( String(100), nullable=False, ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False, ) class OnboardingState(Base): __tablename__ = "onboarding_state" id: Mapped[int] = mapped_column( Integer, primary_key=True, autoincrement=True, ) session_id: Mapped[str] = mapped_column( String(50), ForeignKey("onboarding_sessions.session_id"), unique=True, nullable=False, index=True, ) state_json: Mapped[str] = mapped_column( Text, nullable=False, default="{}", ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), nullable=False, )