"""
FYP2 Additional Models — Virtual Legal Workflow Pipeline
Add these to models.py OR import this file in database.py init_db().

New tables:
  - Hearing          : Virtual hearing rooms (Daily.co / Jitsi)
  - CourtFiling      : Formal court filing records
  - CaseMessage      : In-app messaging between client and lawyer
  - CaseDocument     : Documents uploaded by client or lawyer per case
  - DraftedPetition  : AI-generated legal petitions
  - LawyerNote       : Private lawyer notes on a case
  - Notification     : In-app notification system
  - ChatMessage      : Multi-turn chatbot conversation history
"""
from sqlalchemy import (
    Column, Integer, String, Float, DateTime, Text, Boolean, ForeignKey
)
from sqlalchemy.orm import relationship

from ..services.database import Base
from ..utils import utcnow


# ── Hearing ──────────────────────────────────────────────────────────────────
class Hearing(Base):
    __tablename__ = "hearings"

    id               = Column(Integer, primary_key=True, index=True)
    case_id          = Column(Integer, ForeignKey("cases.id"), nullable=False)
    filing_id        = Column(Integer, ForeignKey("court_filings.id"), nullable=True)
    scheduled_date   = Column(String(20), nullable=False)          # e.g. "2026-09-15"
    scheduled_time   = Column(String(20), nullable=False)          # e.g. "10:00 AM"
    hearing_type     = Column(String(50), default="first_hearing") # first_hearing / evidence / arguments / judgment
    judge_name       = Column(String(100), nullable=True)
    zoom_meeting_id  = Column(String(100), nullable=True)          # Zoom meeting ID or Jitsi room name
    zoom_join_url    = Column(String(800), nullable=True)          # Participant join URL
    zoom_start_url   = Column(String(800), nullable=True)          # Host-only start URL (Zoom)
    zoom_password    = Column(String(20),  nullable=True)          # Zoom meeting password
    room_provider    = Column(String(20), default="jitsi")         # "zoom" or "jitsi"
    status           = Column(String(50), default="scheduled")     # scheduled / in_progress / completed / adjourned / cancelled
    outcome_notes    = Column(Text, nullable=True)                 # Judge's notes after hearing
    recording_url    = Column(String(500), nullable=True)          # Cloud recording link (Daily.co)
    next_hearing_id  = Column(Integer, ForeignKey("hearings.id"), nullable=True)
    created_at       = Column(DateTime, default=utcnow)

    case         = relationship("Case", foreign_keys=[case_id])
    next_hearing = relationship("Hearing", remote_side="Hearing.id", foreign_keys=[next_hearing_id])


# ── CourtFiling ──────────────────────────────────────────────────────────────
class CourtFiling(Base):
    __tablename__ = "court_filings"

    id              = Column(Integer, primary_key=True, index=True)
    case_id         = Column(Integer, ForeignKey("cases.id"), nullable=False)
    lawyer_id       = Column(Integer, ForeignKey("users.id"), nullable=False)
    petition_id     = Column(Integer, ForeignKey("drafted_petitions.id"), nullable=True)
    court_type      = Column(String(100), nullable=False)          # Civil Court, High Court, etc.
    court_district  = Column(String(100), nullable=False)
    filing_number   = Column(String(50), unique=True, nullable=False)  # CF-2026-LAH-00089
    filing_date     = Column(DateTime, default=utcnow)
    status          = Column(String(50), default="filed")          # filed / acknowledged / hearing_scheduled / decided
    petition_path   = Column(String(500), nullable=True)           # Path to generated filing PDF
    court_notes     = Column(Text, nullable=True)

    case     = relationship("Case", foreign_keys=[case_id])
    lawyer   = relationship("User", foreign_keys=[lawyer_id])
    hearings = relationship("Hearing", foreign_keys="Hearing.filing_id")


# ── CaseMessage ──────────────────────────────────────────────────────────────
class CaseMessage(Base):
    __tablename__ = "case_messages"

    id          = Column(Integer, primary_key=True, index=True)
    case_id     = Column(Integer, ForeignKey("cases.id"), nullable=False)
    sender_id   = Column(Integer, ForeignKey("users.id"), nullable=False)
    sender_role = Column(String(20), nullable=False)               # "client" or "lawyer"
    content     = Column(Text, nullable=False)
    is_read     = Column(Boolean, default=False)
    sent_at     = Column(DateTime, default=utcnow)

    case   = relationship("Case", foreign_keys=[case_id])
    sender = relationship("User", foreign_keys=[sender_id])


# ── CaseDocument ─────────────────────────────────────────────────────────────
class CaseDocument(Base):
    __tablename__ = "case_documents"

    id             = Column(Integer, primary_key=True, index=True)
    case_id        = Column(Integer, ForeignKey("cases.id"), nullable=False)
    uploaded_by_id = Column(Integer, ForeignKey("users.id"), nullable=False)
    uploader_role  = Column(String(20), nullable=False)            # "client" or "lawyer"
    filename       = Column(String(255), nullable=False)
    file_path      = Column(String(500), nullable=False)
    doc_type       = Column(String(100), nullable=True)            # "FIR", "Sale Deed", "Petition", etc.
    ocr_text       = Column(Text, nullable=True)                   # OCR-extracted text
    file_size_kb   = Column(Float, nullable=True)
    uploaded_at    = Column(DateTime, default=utcnow)

    case        = relationship("Case", foreign_keys=[case_id])
    uploaded_by = relationship("User", foreign_keys=[uploaded_by_id])


# ── DraftedPetition ──────────────────────────────────────────────────────────
class DraftedPetition(Base):
    __tablename__ = "drafted_petitions"

    id            = Column(Integer, primary_key=True, index=True)
    case_id       = Column(Integer, ForeignKey("cases.id"), nullable=False)
    lawyer_id     = Column(Integer, ForeignKey("users.id"), nullable=False)
    petition_type = Column(String(100), nullable=False)            # "Civil Suit", "Family Court Petition", etc.
    content       = Column(Text, nullable=False)                   # Full petition text (AI-generated or edited)
    version       = Column(Integer, default=1)                     # Increments on each redraft
    created_at    = Column(DateTime, default=utcnow)

    case   = relationship("Case", foreign_keys=[case_id])
    lawyer = relationship("User", foreign_keys=[lawyer_id])


# ── LawyerNote ───────────────────────────────────────────────────────────────
class LawyerNote(Base):
    __tablename__ = "lawyer_notes"

    id         = Column(Integer, primary_key=True, index=True)
    case_id    = Column(Integer, ForeignKey("cases.id"), nullable=False)
    lawyer_id  = Column(Integer, ForeignKey("users.id"), nullable=False)
    content    = Column(Text, nullable=False)
    created_at = Column(DateTime, default=utcnow)
    updated_at = Column(DateTime, default=utcnow, onupdate=utcnow)

    case   = relationship("Case", foreign_keys=[case_id])
    lawyer = relationship("User", foreign_keys=[lawyer_id])


# ── Notification ─────────────────────────────────────────────────────────────
class Notification(Base):
    __tablename__ = "notifications"

    id          = Column(Integer, primary_key=True, index=True)
    user_id     = Column(Integer, ForeignKey("users.id"), nullable=False)
    message     = Column(String(500), nullable=False)
    link        = Column(String(300), nullable=True)               # URL to navigate to on click
    notif_type  = Column(String(20), default="info")               # info / success / warning / hearing
    is_read     = Column(Boolean, default=False)
    created_at  = Column(DateTime, default=utcnow)

    user = relationship("User", foreign_keys=[user_id])


# ── ChatMessage (multi-turn chatbot history) ──────────────────────────────────
class ChatMessage(Base):
    __tablename__ = "chat_messages"

    id         = Column(Integer, primary_key=True, index=True)
    session_id = Column(String(100), nullable=False, index=True)   # Client-side UUID
    user_id    = Column(Integer, ForeignKey("users.id"), nullable=True)
    role       = Column(String(10), nullable=False)                # "user" or "model"
    content    = Column(Text, nullable=False)
    created_at = Column(DateTime, default=utcnow)

    user = relationship("User", foreign_keys=[user_id])
