"""Vista lista de solicitudes + acciones aprobar / rechazar."""
from __future__ import annotations

from datetime import datetime, timedelta

from flask import Blueprint, flash, jsonify, redirect, render_template, request, url_for
from flask_login import current_user, login_required

from models import LicenciaEmpresa, Solicitud, db


bp = Blueprint('solicitudes', __name__)


# ---------------------------------------------------------------------------
# Vistas HTML
# ---------------------------------------------------------------------------
@bp.route('/')
@login_required
def lista():
    estado_filtro = request.args.get('estado', 'Pendiente')

    q = Solicitud.query
    if estado_filtro and estado_filtro != 'Todas':
        q = q.filter(Solicitud.Estado == estado_filtro)
    q = q.order_by(Solicitud.FechaSolicitud.desc())

    solicitudes = q.limit(500).all()

    conteos = {
        'Pendiente': Solicitud.query.filter_by(Estado='Pendiente').count(),
        'Aprobada':  Solicitud.query.filter_by(Estado='Aprobada').count(),
        'Rechazada': Solicitud.query.filter_by(Estado='Rechazada').count(),
    }

    return render_template(
        'solicitudes/lista.html',
        solicitudes=solicitudes,
        estado_filtro=estado_filtro,
        conteos=conteos,
    )


@bp.route('/solicitud/<int:solicitud_id>')
@login_required
def detalle(solicitud_id):
    solicitud = Solicitud.query.get_or_404(solicitud_id)
    return render_template('solicitudes/detalle.html', solicitud=solicitud)


# ---------------------------------------------------------------------------
# Acciones (POST)
# ---------------------------------------------------------------------------
@bp.route('/solicitud/<int:solicitud_id>/aprobar', methods=['POST'])
@login_required
def aprobar(solicitud_id):
    solicitud = Solicitud.query.get_or_404(solicitud_id)

    if solicitud.Estado != 'Pendiente':
        flash(f'La solicitud ya esta en estado "{solicitud.Estado}". No se puede modificar.', 'warning')
        return redirect(url_for('solicitudes.detalle', solicitud_id=solicitud_id))

    duracion       = request.form.get('duracion', 'permanente')
    observaciones  = (request.form.get('observaciones') or '').strip()
    fecha_venc_str = request.form.get('fecha_vencimiento')

    fecha_venc = None
    if duracion == 'mensual':
        fecha_venc = datetime.utcnow() + timedelta(days=30)
    elif duracion == 'trimestral':
        fecha_venc = datetime.utcnow() + timedelta(days=90)
    elif duracion == 'anual':
        fecha_venc = datetime.utcnow() + timedelta(days=365)
    elif duracion == 'custom' and fecha_venc_str:
        try:
            fecha_venc = datetime.strptime(fecha_venc_str, '%Y-%m-%d')
        except ValueError:
            fecha_venc = None

    try:
        # Insertar en LicenciasEmpresas para que ValidarEmpresa del panel viejo
        # lo reconozca como licencia activa.
        licencia = LicenciaEmpresa(
            nit=solicitud.NIT,
            razonsocial=solicitud.NombreEmpresa,
            nombrecomercial=solicitud.NombreComercial,
            direccion=solicitud.Direccion,
            telefono=solicitud.Telefono,
            celular=solicitud.Celular,
            licenciatemporal=(solicitud.LicenciaTemporal == 'SI'),
            fecharegistro=datetime.utcnow(),
            responsable=solicitud.Responsable,
            correoresponsable=solicitud.CorreoResponsable,
            telefonoponsable=solicitud.TelefonoResponsable,
            motivolicencia=solicitud.Motivo,
            claveproducto=solicitud.ClaveProducto,
            nombreequipo=solicitud.NombreEquipo,
            osversion=solicitud.OSVersion,
            clavemes=solicitud.ClaveMes,
            licenciaactiva=True,
            bloquearlicencia=False,
        )
        db.session.add(licencia)

        # Marcar la solicitud como aprobada
        solicitud.Estado           = 'Aprobada'
        solicitud.FechaResolucion  = datetime.utcnow()
        solicitud.UsuarioAprobador = current_user.Username
        solicitud.Observaciones    = observaciones or None
        solicitud.FechaVencimiento = fecha_venc

        db.session.commit()
        flash(f'Solicitud #{solicitud_id} aprobada. El cliente la recibira automaticamente.', 'success')
    except Exception as e:
        db.session.rollback()
        flash(f'Error al aprobar: {e}', 'danger')

    return redirect(url_for('solicitudes.lista'))


@bp.route('/solicitud/<int:solicitud_id>/rechazar', methods=['POST'])
@login_required
def rechazar(solicitud_id):
    solicitud = Solicitud.query.get_or_404(solicitud_id)

    if solicitud.Estado != 'Pendiente':
        flash(f'La solicitud ya esta en estado "{solicitud.Estado}". No se puede modificar.', 'warning')
        return redirect(url_for('solicitudes.detalle', solicitud_id=solicitud_id))

    motivo = (request.form.get('motivo') or '').strip()
    if not motivo:
        flash('Debe indicar un motivo de rechazo.', 'warning')
        return redirect(url_for('solicitudes.detalle', solicitud_id=solicitud_id))

    solicitud.Estado           = 'Rechazada'
    solicitud.FechaResolucion  = datetime.utcnow()
    solicitud.UsuarioAprobador = current_user.Username
    solicitud.Observaciones    = motivo

    try:
        db.session.commit()
        flash(f'Solicitud #{solicitud_id} rechazada.', 'info')
    except Exception as e:
        db.session.rollback()
        flash(f'Error al rechazar: {e}', 'danger')

    return redirect(url_for('solicitudes.lista'))


# ---------------------------------------------------------------------------
# API JSON para auto-refresh del badge
# ---------------------------------------------------------------------------
@bp.route('/api/pendientes/count')
@login_required
def count_pendientes():
    n = Solicitud.query.filter_by(Estado='Pendiente').count()
    return jsonify(pendientes=n)
