from django.http import JsonResponse, HttpResponseForbidden, HttpResponse
from django.shortcuts import render, redirect, get_object_or_404
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt
from account.models import Person
from .models import QRToken, AttendanceLog
from .notifications import send_attendance_email, send_attendance_sms
import qrcode
from io import BytesIO
from django.contrib.auth.decorators import login_required
from django.core.mail import send_mail
from django.conf import settings
from django.utils import timezone
from django.db.models import Count
from .models import AttendanceLog
from account.models import Person
from django.db.models import Q
import csv
import openpyxl

@login_required
def attendance_records(request):
    if request.user.role != "Admin":
        return redirect("index")

    logs = AttendanceLog.objects.select_related("user").all().order_by("-timestamp")

    # Filters
    first_name = request.GET.get("first_name")
    last_name = request.GET.get("last_name")
    email = request.GET.get("email")
    user_class = request.GET.get("user_class")
    start_date = request.GET.get("start_date")
    end_date = request.GET.get("end_date")
    action = request.GET.get("action")

    if first_name:
        logs = logs.filter(user__first_name__icontains=first_name)

    if last_name:
        logs = logs.filter(user__last_name__icontains=last_name)

    if email:
        logs = logs.filter(user__email__icontains=email)

    if user_class:
        logs = logs.filter(user__classe__classe__icontains=user_class)

    if action:
        logs = logs.filter(action=action)

    if start_date and end_date:
        logs = logs.filter(timestamp__date__range=[start_date, end_date])

    # Export CSV
    if "export_csv" in request.GET:
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="attendance.csv"'
        writer = csv.writer(response)
        writer.writerow(["First Name", "Last Name", "Email", "Class", "Action", "Time"])

        for log in logs:
            writer.writerow([
                log.user.first_name,
                log.user.last_name,
                log.user.email,
                getattr(log.user, "student_class", ""),
                log.action,
                timezone.localtime(log.timestamp).strftime("%Y-%m-%d %H:%M:%S")
            ])

        return response

    # Export Excel
    if "export_excel" in request.GET:
        response = HttpResponse(
            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        )
        response['Content-Disposition'] = 'attachment; filename="attendance.xlsx"'

        wb = openpyxl.Workbook()
        ws = wb.active
        ws.append(["First Name", "Last Name", "Email", "Class", "Action", "Time"])

        for log in logs:
            ws.append([
                log.user.first_name,
                log.user.last_name,
                log.user.email,
                getattr(log.user, "student_class", ""),
                log.action,
                timezone.localtime(log.timestamp).strftime("%Y-%m-%d %H:%M:%S")
            ])

        wb.save(response)
        return response

    context = {
        "logs": logs
    }

    return render(request, "attendance/records.html", context)

@login_required
def attendance_dashboard(request):
    if request.user.role == "Admin":
        today = timezone.localtime(timezone.now()).date()

        check_ins_today = AttendanceLog.objects.filter(
            action='IN',
            timestamp__date=today
        ).count()

        check_outs_today = AttendanceLog.objects.filter(
            action='OUT',
            timestamp__date=today
        ).count()

        from django.db.models import OuterRef, Subquery

        latest_log = AttendanceLog.objects.filter(
            user=OuterRef('user')
        ).order_by('-timestamp')

        latest_logs = AttendanceLog.objects.filter(
            id=Subquery(latest_log.values('id')[:1])
        )

        present_now = latest_logs.filter(action='IN').count()
        # Chart data
        daily_counts = (
            AttendanceLog.objects
            .filter(timestamp__date__gte=today - timezone.timedelta(days=6))
            .extra({'day': "date(timestamp)"})
            .values('day')
            .annotate(total=Count('id'))
            .order_by('day')
        )

        roles = (
            Person.objects
            .values('role')
            .annotate(total=Count('id'))
        )

        context = {
            'check_ins_today': check_ins_today,
            'check_outs_today': check_outs_today,
            'present_now': present_now,
            'daily_labels': [d['day'].strftime('%a') for d in daily_counts],
            'daily_values': [d['total'] for d in daily_counts],
            'roles': roles,
        }

        return render(request, 'attendance/analytics.html', context)
    else:
        return redirect('index')

@login_required
def my_qr_code(request):
    user = request.user  # This is a Person instance
    scan_url = request.build_absolute_uri(
        f"/attendance/scan/{user.qr_token}/"
    )

    img = qrcode.make(scan_url)
    buffer = BytesIO()
    img.save(buffer, format='PNG')

    return HttpResponse(buffer.getvalue(), content_type="image/png")

def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        return x_forwarded_for.split(',')[0]
    return request.META.get('REMOTE_ADDR')

@csrf_exempt
def scan_qr(request, token):
    if request.user.role == "Admin" or request.user.role == "Staff":
        # FIRST REQUEST (when QR opens)
        if request.method == "GET":
            return render(request, "attendance/scan.html", {
                "qr_token": token
            })

        # SECOND REQUEST (JavaScript POST)
        if request.method == "POST":
            try:
                user = Person.objects.get(qr_token=token)
                email = user.email

                last_log = AttendanceLog.objects.filter(
                    user=user
                ).order_by('-timestamp').first()

                if last_log and last_log.action == 'IN':
                    action = 'OUT'
                else:
                    action = 'IN'

                AttendanceLog.objects.create(
                    user=user,
                    action=action
                )

                send_attendance_email(user, action, last_log.timestamp.strftime("%Y-%m-%d %H:%M:%S"))

                return JsonResponse({
                    "status": "success",
                    "action": action
                })


            except Exception as e:
                return JsonResponse({
                    "status": "error",
                    "message": str(e)
                })
    else:
        return redirect('index')

@login_required
def qr_scanner(request):
    return render(request, 'attendance/qr_scanner.html')
