from django.shortcuts import render, get_object_or_404, redirect
from django.views import View
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.contrib import messages
from django.core.paginator import Paginator
from django.core.mail import send_mail
from django.conf import settings
from django.db.models import Q
from .models import ContactMessage
from codesofy_lib.custom_config import get_global_master_details, set_menu_items, set_user_profile
from datetime import datetime

menu_item = "contact"

def get_local_master_details():
    return get_global_master_details()


# ==========================================
# PUBLIC VIEWS
# ==========================================

class ContactView(View):
    def get(self, request):
        context = get_local_master_details()
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        return render(request, 'contact.html', context)
    
    def post(self, request):
        name = request.POST.get('name')
        email = request.POST.get('email')
        phone = request.POST.get('phone', '')
        subject = request.POST.get('subject')
        message = request.POST.get('message')
        
        # Validation
        if not name or not email or not subject or not message:
            messages.error(request, "All fields are required.")
            return redirect('contact')
        
        # Save to database
        ContactMessage.objects.create(
            name=name,
            email=email,
            phone=phone,
            subject=subject,
            message=message,
            ip_address=self.get_client_ip(request),
            user_agent=request.META.get('HTTP_USER_AGENT', '')
        )
        
        messages.success(request, "Thank you for your message! We will get back to you soon.")
        return redirect('contact')
    
    def get_client_ip(self, request):
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip


# ==========================================
# ADMIN VIEWS
# ==========================================

@method_decorator(login_required, name='dispatch')
class ContactAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'messages', context)
        
        # Filters
        status = request.GET.get('status', '')
        search = request.GET.get('search', '')
        
        messages_list = ContactMessage.objects.all()
        
        if status:
            messages_list = messages_list.filter(status=status)
        
        if search:
            messages_list = messages_list.filter(
                Q(name__icontains=search) |
                Q(email__icontains=search) |
                Q(subject__icontains=search) |
                Q(message__icontains=search)
            )
        
        paginator = Paginator(messages_list, 20)
        page = request.GET.get('page', 1)
        messages_list = paginator.get_page(page)
        
        context['messages_list'] = messages_list
        context['status'] = status
        context['search'] = search
        context['unread_count'] = ContactMessage.objects.filter(status='unread').count()
        context['total_count'] = ContactMessage.objects.count()
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'contact_messages.html', context)


@method_decorator(login_required, name='dispatch')
class ContactDetailView(View):
    def get(self, request, message_id):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'messages', context)
        
        message = get_object_or_404(ContactMessage, id=message_id)
        
        # Mark as read if unread
        if message.status == 'unread':
            message.mark_as_read()
        
        context['message'] = message
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'contact_detail.html', context)


@method_decorator(login_required, name='dispatch')
class ContactReplyView(View):
    def post(self, request, message_id):
        message = get_object_or_404(ContactMessage, id=message_id)
        reply_message = request.POST.get('reply_message')
        
        if not reply_message:
            messages.error(request, "Please enter a reply message.")
            return redirect('contact_detail', message_id=message_id)
        
        # Save reply
        message.reply_message = reply_message
        message.mark_as_replied()
        
        # Send email reply
        try:
            send_mail(
                subject=f"Re: {message.subject}",
                message=f"Dear {message.name},\n\n{reply_message}\n\nRegards,\n{get_local_master_details().get('company_name', 'CodeSofy Technologies')}",
                from_email=settings.DEFAULT_FROM_EMAIL,
                recipient_list=[message.email],
                fail_silently=False,
            )
            messages.success(request, f"Reply sent to {message.email}")
        except Exception as e:
            messages.error(request, f"Email could not be sent: {str(e)}")
        
        return redirect('contact_detail', message_id=message_id)


@method_decorator(login_required, name='dispatch')
class ContactDeleteView(View):
    def post(self, request, message_id):
        message = get_object_or_404(ContactMessage, id=message_id)
        message.delete()
        messages.success(request, "Message deleted successfully!")
        return redirect('contact_messages')


@method_decorator(login_required, name='dispatch')
class ContactBulkActionView(View):
    def post(self, request):
        action = request.POST.get('action')
        message_ids = request.POST.getlist('message_ids')
        
        if not message_ids:
            messages.error(request, "No messages selected.")
            return redirect('contact_messages')
        
        if action == 'mark_read':
            ContactMessage.objects.filter(id__in=message_ids).update(status='read')
            messages.success(request, f"{len(message_ids)} messages marked as read.")
        elif action == 'mark_unread':
            ContactMessage.objects.filter(id__in=message_ids).update(status='unread')
            messages.success(request, f"{len(message_ids)} messages marked as unread.")
        elif action == 'delete':
            ContactMessage.objects.filter(id__in=message_ids).delete()
            messages.success(request, f"{len(message_ids)} messages deleted.")
        else:
            messages.error(request, "Invalid action.")
        
        return redirect('contact_messages')