from sqlalchemy import Column, String, Integer, ForeignKey, DateTime, Enum, JSON, Boolean
from sqlalchemy.orm import relationship
import uuid
import datetime
from app.db.database import Base

class AgentTemplate(Base):
    __tablename__ = 'agent_templates'

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    name = Column(String, nullable=False)
    description = Column(String, nullable=True)
    system_prompt_path = Column(String, nullable=True)
    max_loop_iterations = Column(Integer, default=20)

    instances = relationship("AgentInstance", back_populates="template")

class AgentInstance(Base):
    __tablename__ = 'agent_instances'

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    template_id = Column(String, ForeignKey('agent_templates.id'), nullable=False)
    session_id = Column(Integer, ForeignKey('sessions.id'), nullable=True)
    mesh_node_id = Column(String, nullable=True) # Just use string or connect to agent_nodes.node_id if needed
    status = Column(String, default='idle') # Enum: active, idle, listening, error_suspended
    current_workspace_jail = Column(String, nullable=True)
    last_heartbeat = Column(DateTime, default=datetime.datetime.utcnow)

    template = relationship("AgentTemplate", back_populates="instances")
    triggers = relationship("AgentTrigger", back_populates="instance")
    
class AgentTrigger(Base):
    __tablename__ = 'agent_triggers'

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    instance_id = Column(String, ForeignKey('agent_instances.id'), nullable=False)
    trigger_type = Column(String, nullable=False) # Enum: webhook, cron, manual
    cron_expression = Column(String, nullable=True)
    webhook_secret = Column(String, nullable=True)
    webhook_mapping_schema = Column(JSON, nullable=True)
    
    instance = relationship("AgentInstance", back_populates="triggers")
