from src.extensions import db
from datetime import datetime
from sqlalchemy.event import listens_for
import secrets

class Agente(db.Model):
    __tablename__ = 'agente'
    id = db.Column(db.Integer, primary_key=True)
    nome = db.Column(db.String(120), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('login.id', ondelete='CASCADE'), nullable=False)
    descricao = db.Column(db.Text, nullable=True)
    system_prompt = db.Column(db.Text, nullable=True)
    example_prompt = db.Column(db.Text, nullable=True)
    welcome_message = db.Column(db.Text, nullable=True)
    temperature = db.Column(db.Float, default=0.7)
    max_tokens = db.Column(db.Integer, default=2000)
    top_p = db.Column(db.Float, default=0.9)
    frequency_penalty = db.Column(db.Float, default=0.0)
    model_identifier = db.Column(db.String(120), nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    public_token = db.Column(db.String(32), unique=True, nullable=False, default=lambda: secrets.token_urlsafe(16))

    chats = db.relationship('Chat', back_populates='agent', cascade='all, delete-orphan')
    treinos = db.relationship('AgenteTreino', back_populates='agente', cascade='all, delete-orphan')

    def __repr__(self):
        return f'<Agente {self.id} - {self.nome}>'

    def to_dict(self):
        return {
            'id': self.id,
            'nome': self.nome,
            'descricao': self.descricao,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None,
            'example_prompt': self.example_prompt
        }
        
@listens_for(Agente, 'before_insert')
def generate_public_token(mapper, connection, target):
    if not target.public_token:
        target.public_token = secrets.token_urlsafe(16)

class AgentUserShare(db.Model):
    __tablename__ = 'agent_user_share'
    id = db.Column(db.Integer, primary_key=True)
    agent_id = db.Column(db.Integer, db.ForeignKey('agente.id', ondelete='CASCADE'), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('login.id', ondelete='CASCADE'), nullable=False)
    permission = db.Column(db.String(20), default='view')
    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)

    agent = db.relationship('Agente', backref='shared_with')
    user = db.relationship('User', backref='shared_with_user') 