from django.shortcuts import render, redirect
from .forms import UserRegistrationForm
from django.contrib.auth import authenticate, login
from django.contrib.auth import logout
from .forms import LoginForm
from .models import CustomUser
from django.contrib.auth.decorators import login_required
from .forms import SetPinsForm

from users.models import PinHistory


from accounts.decorators import role_required
from django.http import FileResponse, Http404
from django.conf import settings
import os
from dashboard.models import Wallet, PromoBanner, QuickAction, ExploreItem, Voucher, ThinBanner
from django.utils.timezone import now
from django.contrib.auth import login
from .models import LoginHistory
from django.shortcuts import render, redirect
from .models import CustomUser
from .forms import RoleUpdateForm
from accounts.decorators import role_required
from django.contrib.admin.views.decorators import staff_member_required
from django.urls import reverse

def register(request):
    if request.method == 'POST':
        print(request.POST)
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')  # or success page
    else:
        form = UserRegistrationForm()
    return render(request, 'accounts/register.html', {'form': form})





def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    return x_forwarded_for.split(',')[0] if x_forwarded_for else request.META.get('REMOTE_ADDR')



from django.utils.http import urlsafe_base64_decode

def login_view(request):
    error = None

    # Pre-fill from GET parameters if available
    initial_data = {
        'mobile_number': request.GET.get('mobile', ''),
        # 'login_pin': request.GET.get('pin', ''),
    }

    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            mobile = form.cleaned_data['mobile_number']
            pin = form.cleaned_data['login_pin']
            remember_me = form.cleaned_data.get('remember_me')
            print (pin)
            try:
                user = CustomUser.objects.get(mobile_number=mobile)
                if user.login_pin == pin:
                    login(request, user)

                    # Save login history
                    LoginHistory.objects.create(
                        user=user,
                        ip_address=get_client_ip(request),
                        user_agent=request.META.get('HTTP_USER_AGENT', '')
                    )

                    # Set session expiry
                    request.session.set_expiry(0 if not remember_me else 1209600)

                    if not user.transaction_pin:
                        return redirect('set_pins')
                    
                    from rest_framework.authtoken.models import Token
                    token, _ = Token.objects.get_or_create(user=user)
                    # print(token)
                    return redirect('../admin/dashboard/')
                else:
                    error = "Incorrect PIN"
            except CustomUser.DoesNotExist:
                error = "Invalid mobile number"
    else:
        form = LoginForm(initial=initial_data)

    return render(request, 'accounts/login.html', {'form': form, 'error': error})





from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from users.models import PinHistory
from django.template.loader import render_to_string
from django.core.mail import send_mail
from django.conf import settings
from datetime import datetime

@login_required
def set_pins(request):
    user = request.user
    if user.login_pin and user.transaction_pin:
        return redirect('home')  # already set

    if request.method == 'POST':
        # Capture 4-digit inputs
        login_pin = ''.join([
            request.POST.get(f'login_pin_{i}', '') for i in range(1, 5)
        ])
        transaction_pin = ''.join([
            request.POST.get(f'transaction_pin_{i}', '') for i in range(1, 5)
        ])

        if len(login_pin) == 4 and len(transaction_pin) == 4 and login_pin.isdigit() and transaction_pin.isdigit():
            user.login_pin = login_pin
            user.transaction_pin = transaction_pin
            user.save()

            # Save history
            PinHistory.objects.create(user=user, pin_type='login', pin_value=login_pin)
            PinHistory.objects.create(user=user, pin_type='transaction', pin_value=transaction_pin)

            # ✅ Send confirmation email
            # ✅ Send success email
            if user.email:
                context = {
                    'user': user,
                    'login_pin': login_pin,
                    'transaction_pin': transaction_pin,
                    'year': datetime.now().year,
                }
                html_msg = render_to_string('email/pin_setup_success.html', context)
                send_mail(
                    subject="Your PINs Are Set - Welcome to Viral Pe",
                    message="",
                    from_email=settings.DEFAULT_FROM_EMAIL,
                    recipient_list=[user.email],
                    html_message=html_msg,
                    fail_silently=False,
                )

            return redirect('home')

        else:
            error = "Please enter valid 4-digit PINs only."
    else:
        error = None

    return render(request, 'accounts/set_pins.html', {'error': error})



@login_required
def profile_view(request):
    return render(request, 'accounts/profile.html', {'user': request.user})

@login_required
@role_required('admin')
def manage_roles(request):
    users = CustomUser.objects.exclude(role='admin_')  # prevent self-assignment
    if request.method == 'POST':
        for user_id in request.POST.getlist('user_ids'):
            try:
                user = CustomUser.objects.get(pk=user_id)
                new_role = request.POST.get(f'role_{user_id}')
                if new_role and user.role != new_role:
                    user.role = new_role
                    user.save()
            except CustomUser.DoesNotExist:
                continue
        return redirect('manage_roles')
    
    return render(request, 'accounts/manage_roles.html', {
            'users': users,
            "pagetitle": "🔧 Manage User Roles",
            "breadcrumbs": [{"label": "Dashboard", "url": reverse("dashboard")}, {"label": "Manage User Roles"}],
        })

from accounts.models import LoginHistory

@staff_member_required
def login_history_view(request):
    history = LoginHistory.objects.select_related('user').order_by('-timestamp')[:100]
    return render(request, 'accounts/login_history.html',
                  {
                    'history': history,
                    "pagetitle": "🔧 User Login History",
                    "breadcrumbs": [{
                        "label": "Dashboard", "url": reverse("dashboard")},
                        {"label": "User Login History"}
                    ],
                })

def logout_view(request):
    logout(request)
    return redirect('/')