from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from src.extensions import db

class User(UserMixin, db.Model):
    __tablename__ = 'login'
    
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(255), nullable=False)
    role = db.Column(db.String(20), nullable=False, default='operator')

    agentes = db.relationship('Agente', backref='user', lazy=True, cascade='all, delete-orphan')
    chats = db.relationship('Chat', back_populates='user', lazy=True, cascade='all, delete-orphan')
    shared_agent_links = db.relationship('AgentUserShare', foreign_keys='AgentUserShare.user_id', backref='shared_with_user', lazy=True, cascade='all, delete-orphan')

    def __repr__(self):
        return f'<User {self.username}>'

    def set_password(self, password):
        print(f"Definindo senha para usuário {self.username}")  
        self.password = generate_password_hash(password)
        print(f"Hash gerado: {self.password}")  

    def check_password(self, password):
        print(f"Verificando senha para usuário {self.username}")  
        print(f"Hash armazenado: {self.password}")  
        result = check_password_hash(self.password, password)
        print(f"Resultado da verificação: {result}")  
        return result

    def get_id(self):
        return str(self.id) 

    def make_superadmin(self):
        self.role = 'superadmin' 

    @classmethod
    def promote_to_superadmin(cls, email):
        user = cls.query.filter_by(email=email).first()
        if user:
            user.role = 'superadmin'
            db.session.commit()
            from src.discord.discord_webhook import send_discord_audit_log
            send_discord_audit_log(
                action="Promoção de superadmin",
                user_id=user.id,
                object_type="Usuário",
                object_id=user.id,
                details=f"Usuário promovido a superadmin: {user.username} ({user.email})",
                ip_address=None
            )
            return True
        return False 