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 TenantScoped:
    __abstract__ = True  # marker mixin, no columns here


class Case(TenantScoped, 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')
    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):  # no tenant_id column → do NOT inherit TenantScoped
    __tablename__ = 'messages'
    id = Column(Integer, primary_key=True)
    case_id = Column(Integer, ForeignKey('cases.id'), nullable=False)
    role = Column(String(20), nullable=False)
    content = Column(Text, nullable=False)
    button_choice = Column(String(255))
    timestamp = Column(DateTime, default=datetime.utcnow)
    case = relationship("Case", back_populates="messages")
    followups = relationship("FollowupQuestion", back_populates="message")


class FollowupQuestion(Base):  # no tenant_id
    __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(TenantScoped, 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)
    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(TenantScoped, 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)
    tags = Column(String(255))
    uploaded_at = Column(DateTime, default=datetime.utcnow)
    tenant = relationship("Tenant", back_populates="documents")


class User(TenantScoped, 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(TenantScoped, 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(TenantScoped, 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")
