"""
app/routes/reportes.py – Generación de reportes PDF.
Reporte individual (por cambio) y reporte de listado con filtros.
"""
import logging
from datetime import datetime
from flask import (Blueprint, render_template, request, send_file, flash,
                   redirect, url_for)
from flask_login import login_required, current_user

from app.models import Cambio, Sistema, Usuario
from app.forms  import FiltrosReporteForm
from app.utils.pdf_generator import (generar_pdf_cambio_individual,
                                      generar_pdf_listado_cambios)

reportes_bp = Blueprint('reportes', __name__, url_prefix='/reportes')
logger       = logging.getLogger(__name__)


@reportes_bp.route('/')
@login_required
def index():
    """Pantalla de reportes con formulario de filtros."""
    form = FiltrosReporteForm()

    # Poblar opciones de combos
    form.sistema_id.choices = [(0, 'Todos')] + [
        (s.id, s.nombre) for s in Sistema.query.filter_by(activo=True)
                                                .order_by(Sistema.nombre).all()
    ]
    form.usuario_solicitante.choices = [(0, 'Todos')] + [
        (u.id, u.nombre_completo)
        for u in Usuario.query.filter_by(activo=True).order_by(Usuario.nombre_completo).all()
    ]

    return render_template('reportes/index.html', form=form)


@reportes_bp.route('/cambio/<int:id>/pdf')
@login_required
def cambio_pdf(id):
    """Descarga el PDF de un cambio individual."""
    cambio = Cambio.query.get_or_404(id)

    # Promotores solo pueden ver sus propios cambios
    if current_user.es_promotor and cambio.usuario_solicitante_id != current_user.id:
        flash('No tienes permiso para generar este reporte.', 'danger')
        return redirect(url_for('reportes.index'))

    buffer      = generar_pdf_cambio_individual(cambio, current_user)
    nombre_arch = f'Cambio_{id}_{datetime.now().strftime("%Y%m%d")}.pdf'
    logger.info('Reporte individual PDF: cambio #%s por %s', id, current_user.correo)
    return send_file(
        buffer,
        mimetype='application/pdf',
        as_attachment=True,
        download_name=nombre_arch,
    )


@reportes_bp.route('/listado/pdf', methods=['POST'])
@login_required
def listado_pdf():
    """Genera el PDF de listado con los filtros del formulario."""
    form = FiltrosReporteForm()
    form.sistema_id.choices = [(0, 'Todos')] + [
        (s.id, s.nombre) for s in Sistema.query.filter_by(activo=True)
                                                .order_by(Sistema.nombre).all()
    ]
    form.usuario_solicitante.choices = [(0, 'Todos')] + [
        (u.id, u.nombre_completo)
        for u in Usuario.query.filter_by(activo=True).order_by(Usuario.nombre_completo).all()
    ]

    if not form.validate_on_submit():
        flash('Error en los filtros. Verifica los datos ingresados.', 'danger')
        return redirect(url_for('reportes.index'))

    # Construir query con filtros
    q = Cambio.query

    # Promotores solo ven sus cambios
    if current_user.es_promotor:
        q = q.filter_by(usuario_solicitante_id=current_user.id)

    if form.fecha_desde.data:
        q = q.filter(Cambio.creado_en >= form.fecha_desde.data)

    if form.fecha_hasta.data:
        from datetime import time
        # Incluir todo el día 'hasta'
        hasta_fin = datetime.combine(form.fecha_hasta.data, time(23, 59, 59))
        q = q.filter(Cambio.creado_en <= hasta_fin)

    if form.sistema_id.data and form.sistema_id.data != 0:
        q = q.filter_by(sistema_id=form.sistema_id.data)

    if form.estatus.data and form.estatus.data not in ('0', 0):
        q = q.filter_by(estatus=form.estatus.data)

    if form.usuario_solicitante.data and form.usuario_solicitante.data != 0:
        q = q.filter_by(usuario_solicitante_id=form.usuario_solicitante.data)

    cambios = q.order_by(Cambio.creado_en.desc()).all()

    # Construir resumen de filtros para el PDF
    filtros = {}
    if form.fecha_desde.data:
        filtros['fecha_desde'] = form.fecha_desde.data
    if form.fecha_hasta.data:
        filtros['fecha_hasta'] = form.fecha_hasta.data
    if form.sistema_id.data and form.sistema_id.data != 0:
        s = Sistema.query.get(form.sistema_id.data)
        filtros['sistema'] = s.nombre if s else ''
    if form.estatus.data and form.estatus.data not in ('0', 0):
        filtros['estatus'] = form.estatus.data
    if form.usuario_solicitante.data and form.usuario_solicitante.data != 0:
        u = Usuario.query.get(form.usuario_solicitante.data)
        filtros['solicitante'] = u.nombre_completo if u else ''

    buffer      = generar_pdf_listado_cambios(cambios, filtros, current_user)
    nombre_arch = f'ReporteCambios_{datetime.now().strftime("%Y%m%d_%H%M")}.pdf'
    logger.info('Reporte listado PDF generado por %s: %d registros',
                current_user.correo, len(cambios))
    return send_file(
        buffer,
        mimetype='application/pdf',
        as_attachment=True,
        download_name=nombre_arch,
    )
