"""
FAB Club Auth Views for YOUR COMPANY tenant sites

Provides:
  /fab/login/           — redirect to FAB Club OAuth authorize
  /fab/callback/        — OAuth callback, handled by python-social-auth
  /fab/disconnect/      — revoke FAB Club connection
  /fab/status/          — JSON: current FAB session data (for frontend JS)
"""
from django.shortcuts import redirect
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.contrib import messages


def fab_login_redirect(request):
    """
    Kick off the FAB Club OAuth flow.
    python-social-auth handles /social/login/fabclub/ automatically,
    but this view lets us add the `next` param before redirecting.
    """
    next_url = request.GET.get('next', '/')
    request.session['fab_next'] = next_url
    # python-social-auth will handle the actual OAuth redirect
    return redirect(f'/social/login/fabclub/?next={next_url}')


@login_required
def fab_status(request):
    """
    Returns current FAB session data as JSON.
    Used by JavaScript widgets to display tier/points without a page reload.
    """
    return JsonResponse({
        'authenticated': True,
        'fab_number':    request.session.get('fab_number'),
        'fab_tier':      request.session.get('fab_tier'),
        'fab_points':    request.session.get('fab_points', 0),
        'fab_wallet':    request.session.get('fab_wallet', 0),
        'fab_login_at':  request.session.get('fab_login_at'),
    })


@login_required
@require_POST
def fab_disconnect(request):
    """Remove FAB Club social association from this account."""
    try:
        from social_django.models import UserSocialAuth
        UserSocialAuth.objects.filter(user=request.user, provider='fabclub').delete()
        for key in ['fab_number', 'fab_tier', 'fab_points', 'fab_wallet', 'fab_login_at']:
            request.session.pop(key, None)
        messages.success(request, 'FAB Club account disconnected.')
    except Exception as e:
        messages.error(request, f'Could not disconnect: {e}')
    return redirect('/')
