from flask_sqlalchemy import SQLAlchemy from datetime import datetime import enum db = SQLAlchemy() class Country(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), unique=True, nullable=False) region = db.Column(db.String(100), nullable=False) cases = db.relationship("Case", backref="country_context", lazy=True) reports = db.relationship("Report", backref="report_country_context", lazy=True) def __repr__(self): return f"" class CaseStatus(enum.Enum): ACTIVE = "Active" PENDING = "Pending" COMPLETED = "Completed" CLOSED = "Closed" class Case(db.Model): id = db.Column(db.Integer, primary_key=True) case_id_display = db.Column(db.String(50), unique=True, nullable=False) case_type = db.Column(db.String(100), nullable=False) suspect_name = db.Column(db.String(150), nullable=False) profile_details = db.Column(db.Text, nullable=True) evidence_summary = db.Column(db.Text, nullable=True) status = db.Column(db.Enum(CaseStatus), default=CaseStatus.PENDING, nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) country_id = db.Column(db.Integer, db.ForeignKey("country.id"), nullable=True) # For recommendation context interrogation_sessions = db.relationship("InterrogationSession", backref="case", lazy=True, cascade="all, delete-orphan") reports = db.relationship("Report", backref="case", lazy=True, cascade="all, delete-orphan") def __repr__(self): return f"" class InterrogationSession(db.Model): id = db.Column(db.Integer, primary_key=True) case_id = db.Column(db.Integer, db.ForeignKey("case.id"), nullable=False) session_date = db.Column(db.DateTime, default=datetime.utcnow) summary_notes = db.Column(db.Text, nullable=True) generated_questions = db.relationship("GeneratedQuestion", backref="session", lazy=True, cascade="all, delete-orphan") def __repr__(self): return f"" class GeneratedQuestion(db.Model): id = db.Column(db.Integer, primary_key=True) interrogation_session_id = db.Column(db.Integer, db.ForeignKey("interrogation_session.id"), nullable=False) question_text = db.Column(db.Text, nullable=False) category = db.Column(db.String(100), nullable=True) generated_at = db.Column(db.DateTime, default=datetime.utcnow) responses = db.relationship("InterrogationResponse", backref="question", lazy=True, cascade="all, delete-orphan") def __repr__(self): return f"" class InterrogationResponse(db.Model): id = db.Column(db.Integer, primary_key=True) generated_question_id = db.Column(db.Integer, db.ForeignKey("generated_question.id"), nullable=False) response_text = db.Column(db.Text, nullable=True) tags = db.Column(db.String(200), nullable=True) # e.g., "evasiveness,contradiction" responded_at = db.Column(db.DateTime, default=datetime.utcnow) def __repr__(self): return f"" class Report(db.Model): id = db.Column(db.Integer, primary_key=True) case_id = db.Column(db.Integer, db.ForeignKey("case.id"), nullable=False) generated_at = db.Column(db.DateTime, default=datetime.utcnow) llm_json_output = db.Column(db.Text, nullable=True) # Raw JSON from LLM report_content_summary = db.Column(db.Text, nullable=True) # Processed summary for display recommendations = db.Column(db.Text, nullable=True) # Country-specific recommendations country_id = db.Column(db.Integer, db.ForeignKey("country.id"), nullable=True) # Context for recommendations def __repr__(self): return f""