from flask import Blueprint, request, jsonify
from app.database import db
from app.auth import hash_password, verify_password, generate_jwt, login_required

auth_bp = Blueprint("auth", __name__)

@auth_bp.route("/login", methods=["POST"])
def login():
    """Autentica usuário e retorna token JWT."""
    data = request.get_json() or {}
    email = data.get("email", "").strip()
    senha = data.get("password", "").strip()

    if not email or not senha:
        return jsonify({"success": False, "error": "Informe e-mail e senha para continuar."}), 400

    user = db.execute_query("SELECT * FROM usuarios WHERE email = %s AND ativo = 1", (email,), fetch="one")
    if not user:
        # Fallback de busca caso SQLite
        user = db.execute_query("SELECT * FROM usuarios WHERE email = ? AND ativo = 1", (email,), fetch="one")

    if not user or not verify_password(senha, user["senha_hash"]):
        db.log_event("WARN", "AUTH", f"Tentativa de login falha para o e-mail {email}")
        return jsonify({"success": False, "error": "E-mail ou senha incorretos."}), 401

    token = generate_jwt(user)
    user_info = {
        "id": user["id"],
        "nome": user["nome"],
        "email": user["email"],
        "cargo": user["cargo"],
        "role": user["role"],
        "avatar": user["avatar"]
    }

    db.log_event("INFO", "AUTH", f"Login bem-sucedido: {user['nome']} ({user['email']})")

    return jsonify({
        "success": True,
        "token": token,
        "user": user_info,
        "message": "Autenticado com sucesso no DuoBI."
    })

@auth_bp.route("/me", methods=["GET"])
@login_required
def me():
    """Retorna os dados do usuário conectado."""
    user_id = request.current_user["id"]
    user = db.execute_query("SELECT id, nome, email, cargo, role, avatar, criado_em FROM usuarios WHERE id = %s", (user_id,), fetch="one")
    if not user:
        user = db.execute_query("SELECT id, nome, email, cargo, role, avatar, criado_em FROM usuarios WHERE id = ?", (user_id,), fetch="one")
    
    if not user:
        return jsonify({"success": False, "error": "Usuário não encontrado."}), 404
        
    return jsonify({"success": True, "user": user})

@auth_bp.route("/users", methods=["GET"])
@login_required
def list_users():
    """Lista todos os usuários do sistema."""
    users = db.execute_query("SELECT id, nome, email, cargo, role, avatar, ativo, criado_em FROM usuarios ORDER BY id ASC") or []
    return jsonify({"success": True, "users": users})

@auth_bp.route("/profile", methods=["POST"])
@login_required
def update_profile():
    """Atualiza perfil do usuário conectado (nome, email, cargo, foto/avatar)."""
    try:
        user_id = request.current_user["id"]
        data = request.get_json() or {}
        
        cur_user = request.current_user or {}
        nome = data.get("nome", "").strip() or cur_user.get("nome", "Usuário DuoBI")
        email = data.get("email", "").strip() or cur_user.get("email", "admin@duobi.com.br")
        cargo = data.get("cargo", "").strip() or cur_user.get("cargo", "Gestor de BI")
        avatar = data.get("avatar", "").strip() or cur_user.get("avatar", "")

        if not nome:
            return jsonify({"success": False, "error": "Nome é obrigatório."}), 400

        update_sql = """
        UPDATE usuarios 
        SET nome = %s, email = %s, cargo = %s, avatar = %s 
        WHERE id = %s
        """
        try:
            db.execute_query(update_sql, (nome, email, cargo, avatar, user_id))
        except Exception:
            # Fallback para SQLite
            update_sql_sqlite = "UPDATE usuarios SET nome = ?, email = ?, cargo = ?, avatar = ? WHERE id = ?"
            db.execute_query(update_sql_sqlite, (nome, email, cargo, avatar, user_id))

        user = db.execute_query("SELECT id, nome, email, cargo, role, avatar FROM usuarios WHERE id = %s", (user_id,), fetch="one") or {}

        db.log_event("INFO", "AUTH", f"Perfil atualizado pelo usuário {nome} ({email})")

        return jsonify({
            "success": True,
            "message": "Perfil atualizado com sucesso!",
            "user": user
        })
    except Exception as e:
        return jsonify({"success": False, "error": str(e)}), 400

@auth_bp.route("/users", methods=["POST"])
@login_required
def create_user():
    """Cadastra um novo usuário no sistema com foto/avatar, cargo e senha."""
    try:
        data = request.get_json() or {}
        nome = data.get("nome", "").strip()
        email = data.get("email", "").strip()
        senha = data.get("password", "").strip()
        cargo = data.get("cargo", "Consultor CRM").strip()
        role = data.get("role", "analista").strip()
        avatar = data.get("avatar", "https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150").strip()

        if not nome or not email or not senha:
            return jsonify({"success": False, "error": "Informe Nome, E-mail e Senha."}), 400

        # Verifica e-mail duplicado
        existing = db.execute_query("SELECT id FROM usuarios WHERE email = %s", (email,), fetch="one")
        if existing:
            return jsonify({"success": False, "error": "Este e-mail já está cadastrado."}), 400

        senha_hash = hash_password(senha)
        insert_sql = """
        INSERT INTO usuarios (nome, email, senha_hash, cargo, role, avatar, ativo)
        VALUES (%s, %s, %s, %s, %s, %s, 1)
        """
        try:
            db.execute_query(insert_sql, (nome, email, senha_hash, cargo, role, avatar))
        except Exception:
            insert_sql_sq = "INSERT INTO usuarios (nome, email, senha_hash, cargo, role, avatar, ativo) VALUES (?, ?, ?, ?, ?, ?, 1)"
            db.execute_query(insert_sql_sq, (nome, email, senha_hash, cargo, role, avatar))

        db.log_event("INFO", "ADMIN", f"Novo usuário criado: {nome} ({email}) com cargo {cargo}")

        users = db.execute_query("SELECT id, nome, email, cargo, role, avatar, ativo, criado_em FROM usuarios ORDER BY id ASC") or []
        return jsonify({"success": True, "message": f"Usuário {nome} cadastrado com sucesso!", "users": users})
    except Exception as e:
        return jsonify({"success": False, "error": str(e)}), 400

@auth_bp.route("/users/<int:user_id>", methods=["DELETE"])
@login_required
def delete_user(user_id):
    """Exclui um usuário do sistema."""
    try:
        if user_id == request.current_user["id"]:
            return jsonify({"success": False, "error": "Você não pode excluir o seu próprio usuário conectado."}), 400

        try:
            db.execute_query("DELETE FROM usuarios WHERE id = %s", (user_id,))
        except Exception:
            db.execute_query("DELETE FROM usuarios WHERE id = ?", (user_id,))

        db.log_event("WARN", "ADMIN", f"Usuário ID {user_id} excluído.")
        users = db.execute_query("SELECT id, nome, email, cargo, role, avatar, ativo, criado_em FROM usuarios ORDER BY id ASC") or []
        return jsonify({"success": True, "message": "Usuário removido com sucesso.", "users": users})
    except Exception as e:
        return jsonify({"success": False, "error": str(e)}), 400

@auth_bp.route("/users/<int:user_id>", methods=["PUT"])
@login_required
def update_user(user_id):
    """Atualiza dados, cargo e avatar de qualquer usuário cadastrado."""
    try:
        data = request.get_json() or {}
        nome = data.get("nome", "").strip()
        email = data.get("email", "").strip()
        cargo = data.get("cargo", "").strip()
        role = data.get("role", "").strip()
        avatar = data.get("avatar", "").strip()
        senha = data.get("password", "").strip()

        user = db.execute_query("SELECT * FROM usuarios WHERE id = %s", (user_id,), fetch="one")
        if not user:
            user = db.execute_query("SELECT * FROM usuarios WHERE id = ?", (user_id,), fetch="one")
        if not user:
            return jsonify({"success": False, "error": "Usuário não encontrado."}), 404

        new_nome = nome or user["nome"]
        new_email = email or user["email"]
        new_cargo = cargo or user.get("cargo") or "Consultor CRM"
        new_role = role or user.get("role") or "analista"
        new_avatar = avatar if avatar else user.get("avatar", "")

        if senha:
            senha_hash = hash_password(senha)
            try:
                db.execute_query("UPDATE usuarios SET nome = %s, email = %s, cargo = %s, role = %s, avatar = %s, senha_hash = %s WHERE id = %s", (new_nome, new_email, new_cargo, new_role, new_avatar, senha_hash, user_id))
            except Exception:
                db.execute_query("UPDATE usuarios SET nome = ?, email = ?, cargo = ?, role = ?, avatar = ?, senha_hash = ? WHERE id = ?", (new_nome, new_email, new_cargo, new_role, new_avatar, senha_hash, user_id))
        else:
            try:
                db.execute_query("UPDATE usuarios SET nome = %s, email = %s, cargo = %s, role = %s, avatar = %s WHERE id = %s", (new_nome, new_email, new_cargo, new_role, new_avatar, user_id))
            except Exception:
                db.execute_query("UPDATE usuarios SET nome = ?, email = ?, cargo = ?, role = ?, avatar = ? WHERE id = ?", (new_nome, new_email, new_cargo, new_role, new_avatar, user_id))

        db.log_event("INFO", "ADMIN", f"Usuário {new_nome} (ID {user_id}) atualizado.")
        users = db.execute_query("SELECT id, nome, email, cargo, role, avatar, ativo, criado_em FROM usuarios ORDER BY id ASC") or []
        return jsonify({"success": True, "message": f"Usuário {new_nome} atualizado com sucesso!", "users": users})
    except Exception as e:
        return jsonify({"success": False, "error": str(e)}), 400
