from flask import Blueprint, request, jsonify
from flask_login import login_required, current_user
from werkzeug.security import generate_password_hash, check_password_hash
from src.extensions import db
from src.models.user import User
import os
from src.discord.discord_webhook import send_discord_audit_log

profile_bp = Blueprint('profile_api', __name__)

@profile_bp.route('/api/profile/update', methods=['POST'])
@login_required
def update_profile():
    data = request.get_json()
    name = data.get('name', '').strip()
    email = data.get('email', '').strip().lower()
    bio = data.get('bio', '').strip()
    if not name or not email:
        return jsonify({'error': 'Nome e email são obrigatórios'}), 400
    current_user.name = name
    current_user.email = email
    current_user.bio = bio
    db.session.commit()
    return jsonify({'message': 'Perfil atualizado com sucesso!'})

@profile_bp.route('/api/profile/preferences', methods=['POST'])
@login_required
def update_preferences():
    data = request.get_json()
    current_user.default_model = data.get('defaultModel', current_user.default_model)
    current_user.default_temperature = float(data.get('defaultTemperature', current_user.default_temperature))
    current_user.default_max_tokens = int(data.get('defaultMaxTokens', current_user.default_max_tokens))
    current_user.save_history = bool(data.get('saveHistory', current_user.save_history))
    db.session.commit()
    send_discord_audit_log(
        action="Alteração de configuração sensível",
        user_id=current_user.id,
        object_type="Usuário",
        object_id=current_user.id,
        details=f"Preferências alteradas: {data}",
        ip_address=request.remote_addr
    )
    return jsonify({'message': 'Preferências atualizadas com sucesso!'})

@profile_bp.route('/api/profile/password', methods=['POST'])
@login_required
def change_password():
    data = request.get_json()
    current_password = data.get('currentPassword', '')
    new_password = data.get('newPassword', '')
    if not current_user.check_password(current_password):
        send_discord_audit_log(
            action="Alteração de senha",
            user_id=current_user.id,
            object_type="Usuário",
            object_id=current_user.id,
            details="Tentativa de alteração de senha falhou (senha atual incorreta)",
            ip_address=request.remote_addr
        )
        return jsonify({'error': 'Senha atual incorreta'}), 400
    if not new_password or len(new_password) < 6:
        send_discord_audit_log(
            action="Alteração de senha",
            user_id=current_user.id,
            object_type="Usuário",
            object_id=current_user.id,
            details="Tentativa de alteração de senha falhou (nova senha muito curta)",
            ip_address=request.remote_addr
        )
        return jsonify({'error': 'Nova senha deve ter pelo menos 6 caracteres'}), 400
    current_user.set_password(new_password)
    db.session.commit()
    send_discord_audit_log(
        action="Alteração de senha",
        user_id=current_user.id,
        object_type="Usuário",
        object_id=current_user.id,
        details="Senha alterada com sucesso",
        ip_address=request.remote_addr
    )
    return jsonify({'message': 'Senha alterada com sucesso!'})

@profile_bp.route('/api/profile/avatar', methods=['POST'])
@login_required
def upload_avatar():
    if 'avatar' not in request.files:
        return jsonify({'error': 'Nenhum arquivo enviado'}), 400
    file = request.files['avatar']
    if file.filename == '':
        return jsonify({'error': 'Arquivo inválido'}), 400
    ext = os.path.splitext(file.filename)[1].lower()
    if ext not in ['.jpg', '.jpeg', '.png', '.gif']:
        return jsonify({'error': 'Formato não suportado'}), 400
    filename = f'user_{current_user.id}_avatar{ext}'
    upload_folder = os.path.join('static', 'avatars')
    os.makedirs(upload_folder, exist_ok=True)
    filepath = os.path.join(upload_folder, filename)
    file.save(filepath)
    current_user.avatar_url = f'/static/avatars/{filename}'
    db.session.commit()
    send_discord_audit_log(
        action="Upload de avatar",
        user_id=current_user.id,
        object_type="Avatar",
        object_id=current_user.id,
        details=f"Avatar enviado: {filename} ({os.path.getsize(filepath)} bytes)",
        ip_address=request.remote_addr
    )
    return jsonify({'avatarUrl': current_user.avatar_url, 'message': 'Avatar atualizado com sucesso!'})

@profile_bp.route('/api/profile/request_password_reset', methods=['POST'])
def request_password_reset():
    data = request.get_json()
    email = data.get('email', '').strip().lower()
    if not email:
        return jsonify({'error': 'Email é obrigatório'}), 400
    user = User.query.filter_by(email=email).first()
    if not user:
        send_discord_audit_log(
            action="Solicitação de reset de senha",
            user_id=None,
            object_type="Usuário",
            object_id=None,
            details=f"Solicitação de reset de senha para email não cadastrado: {email}",
            ip_address=request.remote_addr
        )
        return jsonify({'message': 'Se o email existir, você receberá instruções.'})
    send_discord_audit_log(
        action="Solicitação de reset de senha",
        user_id=user.id,
        object_type="Usuário",
        object_id=user.id,
        details=f"Solicitação de reset de senha para {user.email}",
        ip_address=request.remote_addr
    )
    return jsonify({'message': 'Se o email existir, você receberá instruções.'}) 