"""CRUD de Usuarios admin del panel."""
from flask import Blueprint, jsonify, request
from flask_login import current_user, login_required

from models import Usuario, db


bp = Blueprint('usuarios', __name__)


def _admin_required(fn):
    from functools import wraps
    @wraps(fn)
    def wrapper(*args, **kwargs):
        if (current_user.Rol or '').lower() != 'admin':
            return jsonify(ok=False, error='Solo Admin'), 403
        return fn(*args, **kwargs)
    return wrapper


@bp.route('', methods=['GET'])
@login_required
def list_usuarios():
    items = Usuario.query.order_by(Usuario.UsuarioID).all()
    return jsonify(ok=True, items=[u.to_dict() for u in items])


@bp.route('', methods=['POST'])
@login_required
@_admin_required
def create_usuario():
    data = request.get_json(silent=True) or {}
    username = (data.get('Username') or '').strip()
    password = data.get('Password') or ''
    if not username or not password:
        return jsonify(ok=False, error='Username y Password son obligatorios'), 400
    if Usuario.query.filter_by(Username=username).first():
        return jsonify(ok=False, error='Username ya existe'), 409

    u = Usuario(
        Username=username,
        NombreCompleto=data.get('NombreCompleto'),
        Email=data.get('Email'),
        Rol=data.get('Rol') or 'Admin',
        Activo=bool(data.get('Activo', True)),
    )
    u.set_password(password)
    db.session.add(u)
    db.session.commit()
    return jsonify(ok=True, item=u.to_dict()), 201


@bp.route('/<int:usuario_id>', methods=['PUT'])
@login_required
@_admin_required
def update_usuario(usuario_id):
    u = Usuario.query.get_or_404(usuario_id)
    data = request.get_json(silent=True) or {}
    for f in ('NombreCompleto', 'Email', 'Rol'):
        if f in data:
            setattr(u, f, data[f])
    if 'Activo' in data:
        u.Activo = bool(data['Activo'])
    if data.get('Password'):
        u.set_password(data['Password'])
    db.session.commit()
    return jsonify(ok=True, item=u.to_dict())


@bp.route('/<int:usuario_id>', methods=['DELETE'])
@login_required
@_admin_required
def delete_usuario(usuario_id):
    u = Usuario.query.get_or_404(usuario_id)
    if u.UsuarioID == current_user.UsuarioID:
        return jsonify(ok=False, error='No puedes eliminar tu propio usuario'), 400
    db.session.delete(u)
    db.session.commit()
    return jsonify(ok=True)
