from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Boolean
from sqlalchemy.orm import relationship, declarative_base
from datetime import datetime

# ← Declare Base here, once
Base = declarative_base()

class Tenant(Base):
    __tablename__ = 'tenants'
    id = Column(Integer, primary_key=True)
    name = Column(String(255), nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow)

    users = relationship("User", back_populates="tenant")
    sessions = relationship("Session", back_populates="tenant")
    cases = relationship("Case", back_populates="tenant")
    prompts = relationship("Prompt", back_populates="tenant")
    documents = relationship("Document", back_populates="tenant")
    topics = relationship("Topic", back_populates="tenant")



class Case(Base):
    __tablename__ = 'cases'
    id = Column(Integer, primary_key=True)
    tenant_id = Column(Integer, ForeignKey('tenants.id'), nullable=False)
    user_id = Column(Integer, ForeignKey("users.id"), nullable=True)
    session_id = Column(Integer, ForeignKey("sessions.id"), nullable=True)
    title = Column(String(255))
    status = Column(String(50), default='open')  # open, closed, archived
    created_at = Column(DateTime, default=datetime.utcnow)

    tenant = relationship("Tenant", back_populates="cases")
    user = relationship("User", back_populates="cases")
    session = relationship("Session", back_populates="cases")
    messages = relationship("Message", back_populates="case")


class Message(Base):
    __tablename__ = 'messages'
    id = Column(Integer, primary_key=True)
    case_id = Column(Integer, ForeignKey('cases.id'), nullable=False)
    role = Column(String(20), nullable=False)  # user, assistant, system
    content = Column(Text, nullable=False)
    button_choice = Column(String(255))  # stores the text of the button the user clicked
    timestamp = Column(DateTime, default=datetime.utcnow)
    # created_at = Column(DateTime, default=datetime.utcnow)

    case = relationship("Case", back_populates="messages")
    followups = relationship("FollowupQuestion", back_populates="message")


class FollowupQuestion(Base):
    __tablename__ = 'followup_questions'
    id = Column(Integer, primary_key=True)
    message_id = Column(Integer, ForeignKey('messages.id'), nullable=False)
    question_text = Column(Text, nullable=False)

    message = relationship("Message", back_populates="followups")


class Prompt(Base):
    __tablename__ = 'prompts'
    id = Column(Integer, primary_key=True)
    tenant_id = Column(Integer, ForeignKey('tenants.id'), nullable=False)
    name = Column(String(255), nullable=False)
    role = Column(String(20), nullable=False)  # system, user, assistant
    content = Column(Text, nullable=False)
    is_default = Column(Boolean, default=False)
    created_at = Column(DateTime, default=datetime.utcnow)

    tenant = relationship("Tenant", back_populates="prompts")


class Document(Base):
    __tablename__ = 'documents'
    id = Column(Integer, primary_key=True)
    tenant_id = Column(Integer, ForeignKey('tenants.id'), nullable=False)
    case_id = Column(Integer, ForeignKey('cases.id'), nullable=True)
    title = Column(String(255), nullable=False)
    content = Column(Text, nullable=False)
    embedding = Column(Text)  # optionally store embedding as JSON string
    tags = Column(String(255))
    uploaded_at = Column(DateTime, default=datetime.utcnow)

    tenant = relationship("Tenant", back_populates="documents")

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    tenant_id = Column(Integer, ForeignKey("tenants.id"), nullable=False)
    username = Column(String(100), nullable=False)
    email = Column(String(255), nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow)

    tenant = relationship("Tenant", back_populates="users")
    sessions = relationship("Session", back_populates="user")
    cases = relationship("Case", back_populates="user")

    
class Session(Base):
    __tablename__ = "sessions"

    id = Column(Integer, primary_key=True)
    tenant_id = Column(Integer, ForeignKey("tenants.id"), nullable=False)
    user_id = Column(Integer, ForeignKey("users.id"), nullable=True)
    session_token = Column(String(255), nullable=False, unique=True)
    started_at = Column(DateTime, default=datetime.utcnow)

    tenant = relationship("Tenant", back_populates="sessions")
    user = relationship("User", back_populates="sessions")
    cases = relationship("Case", back_populates="session")

class Topic(Base):
    __tablename__ = 'topics'

    id = Column(Integer, primary_key=True)
    tenant_id = Column(Integer, ForeignKey('tenants.id'), nullable=False)
    topic = Column(String(255), nullable=False)
    question = Column(String, nullable=False) 
    started_at = Column(DateTime, default=datetime.utcnow)

    tenant = relationship("Tenant", back_populates="topics")