"""CRUD de Licencias + activar/bloquear."""
from datetime import datetime

from flask import Blueprint, jsonify, request
from flask_login import login_required
from sqlalchemy import or_

import crypto
from models import Empresa, LicenciaEmpresa, db


bp = Blueprint('licencias', __name__)


@bp.route('', methods=['GET'])
@login_required
def list_licencias():
    """GET /api/v1/licencias?q=...&estado=activa|bloqueada|temporal&page=...&per_page=..."""
    q        = (request.args.get('q') or '').strip()
    estado   = request.args.get('estado') or ''
    page     = max(int(request.args.get('page', 1)), 1)
    per_page = min(max(int(request.args.get('per_page', 25)), 1), 200)

    qs = LicenciaEmpresa.query
    if q:
        like = f'%{q}%'
        qs = qs.filter(or_(
            LicenciaEmpresa.nit.like(like),
            LicenciaEmpresa.razonsocial.like(like),
            LicenciaEmpresa.nombrecomercial.like(like),
            LicenciaEmpresa.responsable.like(like),
        ))
    if estado == 'activa':
        qs = qs.filter(LicenciaEmpresa.licenciaactiva == True,
                       LicenciaEmpresa.bloquearlicencia == False)
    elif estado == 'bloqueada':
        qs = qs.filter(LicenciaEmpresa.bloquearlicencia == True)
    elif estado == 'temporal':
        qs = qs.filter(LicenciaEmpresa.licenciatemporal == True)

    total = qs.count()
    items = (qs.order_by(LicenciaEmpresa.fecharegistro.desc())
               .limit(per_page)
               .offset((page - 1) * per_page)
               .all())
    return jsonify(ok=True, total=total, page=page, per_page=per_page,
                   items=[i.to_dict() for i in items])


@bp.route('/<int:licencia_id>', methods=['GET'])
@login_required
def get_licencia(licencia_id):
    l = LicenciaEmpresa.query.get_or_404(licencia_id)
    return jsonify(ok=True, item=l.to_dict())


@bp.route('/by-nit/<string:nit>', methods=['GET'])
@login_required
def list_by_nit(nit):
    items = (LicenciaEmpresa.query
             .filter_by(nit=nit)
             .order_by(LicenciaEmpresa.fecharegistro.desc())
             .all())
    return jsonify(ok=True, items=[i.to_dict() for i in items])


@bp.route('/<int:licencia_id>/activar', methods=['PATCH'])
@login_required
def activar(licencia_id):
    l = LicenciaEmpresa.query.get_or_404(licencia_id)
    l.licenciaactiva   = True
    l.bloquearlicencia = False
    db.session.commit()
    return jsonify(ok=True, item=l.to_dict())


@bp.route('/<int:licencia_id>/bloquear', methods=['PATCH'])
@login_required
def bloquear(licencia_id):
    l = LicenciaEmpresa.query.get_or_404(licencia_id)
    l.licenciaactiva   = False
    l.bloquearlicencia = True
    db.session.commit()
    return jsonify(ok=True, item=l.to_dict())


@bp.route('/by-nit/<string:nit>/activar', methods=['PATCH'])
@login_required
def activar_por_nit(nit):
    """Activa todas las licencias de un NIT (igual que el aceptar/rechazar antiguo)."""
    n = (LicenciaEmpresa.query.filter_by(nit=nit)
         .update({'licenciaactiva': True, 'bloquearlicencia': False}))
    db.session.commit()
    return jsonify(ok=True, actualizadas=n)


@bp.route('/by-nit/<string:nit>/bloquear', methods=['PATCH'])
@login_required
def bloquear_por_nit(nit):
    n = (LicenciaEmpresa.query.filter_by(nit=nit)
         .update({'licenciaactiva': False, 'bloquearlicencia': True}))
    db.session.commit()
    return jsonify(ok=True, actualizadas=n)


@bp.route('/<int:licencia_id>/regenerar-clavemes', methods=['POST'])
@login_required
def regenerar_clavemes(licencia_id):
    """Genera la clavemes manualmente (Encrypt(nit + MM)) - util para soporte."""
    l = LicenciaEmpresa.query.get_or_404(licencia_id)
    mm = datetime.now().strftime('%m')
    l.clavemes       = crypto.encrypt(f'{l.nit}{mm}')
    l.licenciaactiva = True
    db.session.commit()
    return jsonify(ok=True, clavemes=l.clavemes)


@bp.route('/<int:licencia_id>', methods=['DELETE'])
@login_required
def delete_licencia(licencia_id):
    l = LicenciaEmpresa.query.get_or_404(licencia_id)
    db.session.delete(l)
    db.session.commit()
    return jsonify(ok=True)


@bp.route('/stats', methods=['GET'])
@login_required
def stats():
    total       = LicenciaEmpresa.query.count()
    activas     = LicenciaEmpresa.query.filter_by(licenciaactiva=True, bloquearlicencia=False).count()
    bloqueadas  = LicenciaEmpresa.query.filter_by(bloquearlicencia=True).count()
    temporales  = LicenciaEmpresa.query.filter_by(licenciatemporal=True).count()
    return jsonify(ok=True, total=total, activas=activas,
                   bloqueadas=bloqueadas, temporales=temporales)
