"""CRUD de Empresas."""
from datetime import datetime

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

from models import Empresa, db


bp = Blueprint('empresas', __name__)


@bp.route('', methods=['GET'])
@login_required
def list_empresas():
    """GET /api/v1/empresas?q=...&page=1&per_page=25&mensualidad=1&regulariza=0"""
    q          = (request.args.get('q') or '').strip()
    page       = max(int(request.args.get('page', 1)), 1)
    per_page   = min(max(int(request.args.get('per_page', 25)), 1), 200)
    mens_filt  = request.args.get('mensualidad')
    regu_filt  = request.args.get('regulariza')

    qs = Empresa.query
    if q:
        like = f'%{q}%'
        qs = qs.filter(or_(
            Empresa.nit.like(like),
            Empresa.razonsocial.like(like),
            Empresa.nombrecomercial.like(like),
        ))
    if mens_filt is not None and mens_filt != '':
        qs = qs.filter(Empresa.mensualidad == (mens_filt in ('1', 'true', 'True')))
    if regu_filt is not None and regu_filt != '':
        qs = qs.filter(Empresa.regulariza == (regu_filt in ('1', 'true', 'True')))

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


@bp.route('/<int:empresa_id>', methods=['GET'])
@login_required
def get_empresa(empresa_id):
    e = Empresa.query.get_or_404(empresa_id)
    return jsonify(ok=True, item=e.to_dict())


@bp.route('/by-nit/<string:nit>', methods=['GET'])
@login_required
def get_empresa_by_nit(nit):
    e = Empresa.query.filter_by(nit=nit).first_or_404()
    return jsonify(ok=True, item=e.to_dict())


@bp.route('', methods=['POST'])
@login_required
def create_empresa():
    data = request.get_json(silent=True) or {}
    nit  = (data.get('nit') or '').strip()
    if not nit:
        return jsonify(ok=False, error='nit es obligatorio'), 400
    if Empresa.query.filter_by(nit=nit).first():
        return jsonify(ok=False, error='Ya existe una empresa con ese NIT'), 409

    e = Empresa(
        nit=nit,
        razonsocial=data.get('razonsocial'),
        nombrecomercial=data.get('nombrecomercial'),
        direccion=data.get('direccion'),
        telefono=data.get('telefono'),
        celular=data.get('celular'),
        mensualidad=bool(data.get('mensualidad', False)),
        regulariza=bool(data.get('regulariza', False)),
        tipotpv=data.get('tipotpv'),
    )
    db.session.add(e)
    db.session.commit()
    return jsonify(ok=True, item=e.to_dict()), 201


@bp.route('/<int:empresa_id>', methods=['PUT'])
@login_required
def update_empresa(empresa_id):
    e = Empresa.query.get_or_404(empresa_id)
    data = request.get_json(silent=True) or {}
    for f in ('razonsocial', 'nombrecomercial', 'direccion', 'telefono',
              'celular', 'tipotpv'):
        if f in data:
            setattr(e, f, data[f])
    if 'mensualidad' in data:
        e.mensualidad = bool(data['mensualidad'])
    if 'regulariza' in data:
        e.regulariza  = bool(data['regulariza'])
    e.fechaactualizacion = datetime.utcnow()
    db.session.commit()
    return jsonify(ok=True, item=e.to_dict())


@bp.route('/<int:empresa_id>/mensualidad', methods=['PATCH'])
@login_required
def toggle_mensualidad(empresa_id):
    e = Empresa.query.get_or_404(empresa_id)
    data = request.get_json(silent=True) or {}
    e.mensualidad        = bool(data.get('mensualidad', not e.mensualidad))
    e.fechaactualizacion = datetime.utcnow()
    db.session.commit()
    return jsonify(ok=True, item=e.to_dict())


@bp.route('/<int:empresa_id>/regulariza', methods=['PATCH'])
@login_required
def toggle_regulariza(empresa_id):
    e = Empresa.query.get_or_404(empresa_id)
    data = request.get_json(silent=True) or {}
    e.regulariza         = bool(data.get('regulariza', not e.regulariza))
    e.fechaactualizacion = datetime.utcnow()
    db.session.commit()
    return jsonify(ok=True, item=e.to_dict())


@bp.route('/<int:empresa_id>', methods=['DELETE'])
@login_required
def delete_empresa(empresa_id):
    e = Empresa.query.get_or_404(empresa_id)
    db.session.delete(e)
    db.session.commit()
    return jsonify(ok=True)


@bp.route('/stats', methods=['GET'])
@login_required
def stats():
    """KPIs para el dashboard."""
    total      = Empresa.query.count()
    mensuales  = Empresa.query.filter_by(mensualidad=True).count()
    regulares  = Empresa.query.filter_by(regulariza=True).count()
    return jsonify(ok=True, total=total, mensualidad=mensuales, regulariza=regulares)
