from datetime import datetime

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.core.mail import send_mail
from django.db.models import Count, Case, When, IntegerField
from django.shortcuts import render, redirect

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from accounts.models import Customers, CompanyUser, CustomerDocument
from main import settings
from qr_manager.models import Category, Batch
from .company_view.dashboard_views import get_customer_statistics
from .company_view.recent_activities import recently_created_batches
from .company_view.recently_updated_customers import get_recently_updated_customers
from .models import Contact
from .serializers import CustomersSerializer


class CustomersDetailView(APIView):
    def get(self, request, qr_code):
        try:
            customer = Customers.objects.get(qr_code=qr_code)
            if not customer.password:
                return Response({'message': 'Password not set.'}, status=status.HTTP_400_BAD_REQUEST)
            serializer = CustomersSerializer(customer)
            return Response(serializer.data)
        except Customers.DoesNotExist:
            return Response({'error': 'Customer not found'}, status=status.HTTP_404_NOT_FOUND)

    def post(self, request, qr_code=None):
        if qr_code:
            try:
                customer = Customers.objects.get(qr_code=qr_code)
                serializer = CustomersSerializer(customer, data=request.data)
                if serializer.is_valid():
                    serializer.save()
                    return Response(serializer.data, status=status.HTTP_200_OK)
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
            except Customers.DoesNotExist:
                return Response({'error': 'Customer not found'}, status=status.HTTP_404_NOT_FOUND)
        else:
            return Response({'error': 'QR code is required for updating'}, status=status.HTTP_400_BAD_REQUEST)


def login(request):
    return render(request, 'login.html')


def get_last_six_months():
    today = datetime.now()
    months = []
    for i in range(5, -1, -1):
        month = today.month - i
        year = today.year
        if month <= 0:
            month += 12
            year -= 1
        months.append(f"{year}-{month:02d}")
    return months


@login_required
def dashboard(request):
    user = request.user
    if not user.is_superuser:
        dashboard_data = get_customer_statistics(user.company)
        recent_activities = recently_created_batches(user.company)
        last_six_months_list = get_last_six_months()
        recently_updated_customers = get_recently_updated_customers(user.company)
        # monthly_data = get_monthly_customer_data(user.company)
        context = {
            'dashboard_data': dashboard_data,
            'recent_activities': recent_activities,
            'last_six_months_list': last_six_months_list,
            'recently_updated_customers': recently_updated_customers
            # 'monthly_data': monthly_data,
        }
        return render(request, 'index.html', context)
    # return JsonResponse({'error': 'You are a super user'}, status=404)
    return redirect('/admin')


@login_required
def customer_management(request):
    customer = Customers.objects.all()
    return render(request, 'customer_management.html', {'customers': customer})


@login_required
def customer_details(request, customer_id):
    customer = Customers.objects.get(id=customer_id)
    documents = CustomerDocument.objects.filter(customer=customer)
    return render(request, 'customer_details.html', {'customers': customer, 'documents': documents})


@login_required
def qr_code_manager(request):
    # batch_queryset = Batch.objects.filter(created_by=request.user).annotate(customer_count=Count('customers'))
    batch_queryset = Batch.objects.filter(created_by__company=request.user.company).annotate(
        customer_count=Count('customers'),
        registered=Count(
            Case(
                When(customers__password__isnull=False, customers__password__gt='', then=1),
                output_field=IntegerField()
            )
        ),
        unregistered=Count(
            Case(
                When(customers__password__isnull=True, then=1),
                When(customers__password='', then=1),
                output_field=IntegerField()
            )
        )
    )
    batch_data = []
    for batch in batch_queryset:
        batch_data.append({
            'id': batch.id,
            'batch_number': batch.batch_number,
            'batch_name': batch.batch_name,
            'registered': batch.registered,
            'unregistered': batch.unregistered,
            'category': batch.category,
            'created_by': batch.created_by,
            'customer_count': batch.customer_count,
            'created_date': batch.created.strftime('%d/%m/%Y'),  # Format the date
            'created_time': batch.created.strftime('%H:%M'),  # Format the time
        })
    return render(request, 'qr_code_manager.html', {'batch': batch_data})


@login_required()
def batch_history(request, batch_id):
    batch = Batch.objects.filter(id=batch_id).first()
    batch_customers = Customers.objects.filter(batch=batch)
    return render(request, 'batch_history.html', {'batch_customers': batch_customers})


@login_required
def qr_generator(request):
    category = Category.objects.filter(created_by__company=request.user.company, is_active=True, is_deleted=False)
    return render(request, 'qr_generator.html', {'categories': category})


@login_required
def profile(request):
    # company_user = CompanyUser.objects.get(id=request.user.id)
    # return render(request, 'profile.html',{'company_user':company_user})
    return render(request, 'profile.html')


@login_required
def staff_profile(request, staff_id):
    try:
        staff_profile1 = CompanyUser.objects.get(id=staff_id, company=request.user.company)
        return render(request, 'staff_profile.html', {"staff_profile": staff_profile1})
    except Exception as e:
        print(e)
        return redirect("/manage_company_user")


@login_required
def manage_profiles(request):
    return render(request, 'manage_profiles.html')


@login_required
def create_profiles(request):
    return render(request, 'create_profiles.html')


@login_required
def contact(request):
    if request.method == "POST":
        name = request.POST.get('name')
        email = request.POST.get('email')
        subject = request.POST.get('subject')
        message = request.POST.get('message')
        try:

            contact = Contact(name=name, email=email, subject=subject, message=message)
            contact.save()
            try:
                modified_subject = f"Rescuscanner Contact Mail from {name} : "
                try:
                    modified_subject += f"{request.user.company.name}"
                except Exception as e:
                    pass
                modified_message = f"""
                            name:{name}\n
                            subject:{subject}\n
                            email"{email}\n\n
                            message:{message}
                            """
                send_mail(modified_subject, modified_message, settings.DEFAULT_FROM_EMAIL,
                          ['info.rescuescanner@gmail.com', 'onkart4u@gmail.com'], fail_silently=False)
                # added later
                customer_message = f"""
                                    Recieved your message.
                                    details are as follows:\n\n
                                    name:{name}\n
                                    subject:{subject}\n
                                    email"{email}\n\n
                                    message:{message}
                                    """
                send_mail(f"Acknowledgement Mail", customer_message, settings.DEFAULT_FROM_EMAIL,
                          [email], fail_silently=False)

            except Exception as e:
                print(e)
            messages.success(request, "mail sent succefully", extra_tags="success")
            return redirect("/contact")
            # return redirect("/dashboard")
        except:
            return redirect("/dashboard")
    else:
        return render(request, 'contact.html')


@login_required
def reports(request):
    return render(request, 'reports.html')


@login_required
def manage_company_user(request):
    company_user_accounts = CompanyUser.objects.filter(company=request.user.company, is_deleted=False)
    print(company_user_accounts)
    return render(request, 'manage_profiles.html', {"company_user": company_user_accounts})


@login_required
def category(request):
    category_list = Category.objects.filter(created_by__company=request.user.company, is_deleted=False)
    deleted_category_list = Category.objects.filter(created_by__company=request.user.company, is_deleted=True)
    return render(request, 'category.html',
                  {'category_list': category_list, "deleted_category_list": deleted_category_list})
