"""
app/routes/sistemas.py – CRUD de sistemas de la organización (solo Administrador).
"""
import logging
from flask import Blueprint, render_template, redirect, url_for, flash, request
from flask_login import login_required

from app import db
from app.models import Sistema
from app.forms  import SistemaForm
from app.utils.decorators import role_required

sistemas_bp = Blueprint('sistemas', __name__, url_prefix='/sistemas')
logger       = logging.getLogger(__name__)


@sistemas_bp.route('/')
@login_required
@role_required('Administrador')
def lista():
    page     = request.args.get('page', 1, type=int)
    sistemas = (Sistema.query
                .order_by(Sistema.nombre)
                .paginate(page=page, per_page=15, error_out=False))
    return render_template('sistemas/list.html', sistemas=sistemas)


@sistemas_bp.route('/nuevo', methods=['GET', 'POST'])
@login_required
@role_required('Administrador')
def nuevo():
    form = SistemaForm()
    if form.validate_on_submit():
        if Sistema.query.filter_by(nombre=form.nombre.data.strip()).first():
            flash('Ya existe un sistema con ese nombre.', 'danger')
            return render_template('sistemas/form.html', form=form, titulo='Nuevo Sistema')

        sistema = Sistema(
            nombre=form.nombre.data.strip(),
            descripcion=form.descripcion.data,
            activo=form.activo.data,
        )
        db.session.add(sistema)
        db.session.commit()
        logger.info('Sistema creado: %s', sistema.nombre)
        flash('Sistema registrado correctamente.', 'success')
        return redirect(url_for('sistemas.lista'))

    return render_template('sistemas/form.html', form=form, titulo='Nuevo Sistema')


@sistemas_bp.route('/<int:id>/editar', methods=['GET', 'POST'])
@login_required
@role_required('Administrador')
def editar(id):
    sistema = Sistema.query.get_or_404(id)
    form    = SistemaForm(obj=sistema)

    if form.validate_on_submit():
        nombre_nuevo = form.nombre.data.strip()
        existe = Sistema.query.filter(
            Sistema.nombre == nombre_nuevo, Sistema.id != id
        ).first()
        if existe:
            flash('Ya existe otro sistema con ese nombre.', 'danger')
            return render_template('sistemas/form.html', form=form,
                                   titulo='Editar Sistema', sistema=sistema)

        sistema.nombre      = nombre_nuevo
        sistema.descripcion = form.descripcion.data
        sistema.activo      = form.activo.data
        db.session.commit()
        logger.info('Sistema editado: %s', sistema.nombre)
        flash('Sistema actualizado correctamente.', 'success')
        return redirect(url_for('sistemas.lista'))

    return render_template('sistemas/form.html', form=form,
                           titulo='Editar Sistema', sistema=sistema)


@sistemas_bp.route('/<int:id>/toggle', methods=['POST'])
@login_required
@role_required('Administrador')
def toggle_activo(id):
    sistema = Sistema.query.get_or_404(id)
    sistema.activo = not sistema.activo
    db.session.commit()
    estado = 'activado' if sistema.activo else 'desactivado'
    flash(f'Sistema {estado} correctamente.', 'success')
    return redirect(url_for('sistemas.lista'))
