from sqlalchemy import Column, String, Boolean, Integer, DateTime, Text, ForeignKey from sqlalchemy.dialects.postgresql import UUID, JSONB from sqlalchemy.orm import relationship from datetime import datetime from app.database import Base import uuid class Customer(Base): __tablename__ = "customers" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True) name = Column(String(255), nullable=False) company = Column(String(255)) country = Column(String(100)) phone = Column(String(50)) email = Column(String(255)) whatsapp_id = Column(String(255)) source = Column(String(100)) tags = Column(JSONB, default=[]) notes = Column(Text) preference = Column(JSONB, default={}) status = Column(String(50), default="lead") last_contact_at = Column(DateTime) silence_started_at = Column(DateTime) next_followup_at = Column(DateTime) estimated_value = Column(String(50)) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) user = relationship("User", back_populates="customers") conversations = relationship("Conversation", back_populates="customer", cascade="all, delete-orphan") quotations = relationship("Quotation", back_populates="customer") class Conversation(Base): __tablename__ = "conversations" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True) customer_id = Column(UUID(as_uuid=True), ForeignKey("customers.id"), nullable=False, index=True) channel = Column(String(50), default="whatsapp") topic = Column(String(255)) status = Column(String(50), default="active") message_count = Column(Integer, default=0) last_message_at = Column(DateTime) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) user = relationship("User", back_populates="conversations") customer = relationship("Customer", back_populates="conversations") messages = relationship("Message", back_populates="conversation", cascade="all, delete-orphan", order_by="Message.created_at") class Message(Base): __tablename__ = "messages" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) conversation_id = Column(UUID(as_uuid=True), ForeignKey("conversations.id"), nullable=False, index=True) direction = Column(String(20), nullable=False) content = Column(Text, nullable=False) content_translated = Column(Text) content_type = Column(String(50), default="text") ai_suggestions = Column(JSONB) selected_suggestion = Column(Integer) user_edited = Column(Text) status = Column(String(50), default="sent") msg_metadata = Column("metadata", JSONB, default={}) created_at = Column(DateTime, default=datetime.utcnow) conversation = relationship("Conversation", back_populates="messages")