import json
import logging
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from django.utils.decorators import method_decorator
from django.views.generic import View
from django.views.decorators.csrf import csrf_protect
from django.middleware.csrf import get_token
from django.utils import timezone

from .models import Newsletter, ContactMessage
from .forms import NewsletterForm, ContactForm
from apps.common.utils import get_client_ip

logger = logging.getLogger(__name__)


def get_client_info(request):
    """Get client IP and user agent."""
    return {
        'ip_address': get_client_ip(request),
        'user_agent': request.META.get('HTTP_USER_AGENT', '')
    }


@method_decorator(csrf_protect, name='dispatch')
class NewsletterSubscriptionView(View):
    """Handle newsletter subscription via AJAX."""
    
    def post(self, request, *args, **kwargs):
        """Handle POST request for newsletter subscription."""
        try:
            # Parse JSON data
            if request.content_type == 'application/json':
                data = json.loads(request.body)
            else:
                data = request.POST
            
            # Create form instance
            form = NewsletterForm(data)
            
            if form.is_valid():
                email = form.cleaned_data['email']
                
                # Check if already subscribed
                existing = Newsletter.objects.filter(email=email).first()
                
                if existing:
                    if existing.is_subscribed:
                        return JsonResponse({
                            'success': False,
                            'type': 'warning',
                            'message': 'You are already subscribed to our newsletter.',
                            'title': 'Already Subscribed'
                        }, status=400)
                    else:
                        # Resubscribe
                        existing.resubscribe()
                        newsletter = existing
                        action = 'resubscribed'
                else:
                    # Create new subscription
                    newsletter = form.save(commit=False)
                    client_info = get_client_info(request)
                    newsletter.ip_address = client_info['ip_address']
                    newsletter.user_agent = client_info['user_agent']
                    newsletter.source = 'website'
                    newsletter.save()
                    action = 'subscribed'
                
                logger.info(f"Newsletter {action}: {email}")
                
                return JsonResponse({
                    'success': True,
                    'type': 'success',
                    'message': f'Successfully {action} to our newsletter!',
                    'title': 'Subscription Successful',
                    'email': email
                })
            
            else:
                # Form validation errors
                errors = {}
                for field, field_errors in form.errors.items():
                    errors[field] = field_errors
                
                return JsonResponse({
                    'success': False,
                    'type': 'error',
                    'message': 'Please correct the errors below.',
                    'title': 'Validation Error',
                    'errors': errors
                }, status=400)
        
        except json.JSONDecodeError:
            return JsonResponse({
                'success': False,
                'type': 'error',
                'message': 'Invalid JSON data.',
                'title': 'Invalid Request'
            }, status=400)
        
        except Exception as e:
            logger.error(f"Newsletter subscription error: {str(e)}")
            return JsonResponse({
                'success': False,
                'type': 'error',
                'message': 'An error occurred. Please try again later.',
                'title': 'Server Error'
            }, status=500)


@method_decorator(csrf_protect, name='dispatch')
class ContactFormView(View):
    """Handle contact form submission via AJAX."""
    
    def post(self, request, *args, **kwargs):
        """Handle POST request for contact form."""
        try:
            # Parse JSON data
            if request.content_type == 'application/json':
                data = json.loads(request.body)
            else:
                data = request.POST
            
            # Create form instance
            form = ContactForm(data)
            
            if form.is_valid():
                # Save contact message
                contact = form.save(commit=False)
                client_info = get_client_info(request)
                contact.ip_address = client_info['ip_address']
                contact.user_agent = client_info['user_agent']
                contact.source = 'website'
                contact.save()
                
                # Handle newsletter subscription if requested
                if contact.is_newsletter_signup:
                    try:
                        newsletter_data = {
                            'email': contact.email,
                            'first_name': contact.name.split()[0] if contact.name else '',
                            'last_name': ' '.join(contact.name.split()[1:]) if len(contact.name.split()) > 1 else ''
                        }
                        newsletter_form = NewsletterForm(newsletter_data)
                        
                        if newsletter_form.is_valid():
                            newsletter, created = Newsletter.objects.get_or_create(
                                email=contact.email,
                                defaults={
                                    'first_name': newsletter_data['first_name'],
                                    'last_name': newsletter_data['last_name'],
                                    'ip_address': client_info['ip_address'],
                                    'user_agent': client_info['user_agent'],
                                    'source': 'contact_form'
                                }
                            )
                            
                            if not created and not newsletter.is_subscribed:
                                newsletter.resubscribe()
                    
                    except Exception as e:
                        logger.warning(f"Newsletter subscription from contact form failed: {str(e)}")
                
                logger.info(f"Contact form submission from: {contact.email}")
                
                return JsonResponse({
                    'success': True,
                    'type': 'success',
                    'message': 'Thank you for your message! We will get back to you soon.',
                    'title': 'Message Sent Successfully',
                    'contact_id': str(contact.id)
                })
            
            else:
                # Form validation errors
                errors = {}
                for field, field_errors in form.errors.items():
                    errors[field] = field_errors
                
                return JsonResponse({
                    'success': False,
                    'type': 'error',
                    'message': 'Please correct the errors below.',
                    'title': 'Validation Error',
                    'errors': errors
                }, status=400)
        
        except json.JSONDecodeError:
            return JsonResponse({
                'success': False,
                'type': 'error',
                'message': 'Invalid JSON data.',
                'title': 'Invalid Request'
            }, status=400)
        
        except Exception as e:
            logger.error(f"Contact form error: {str(e)}")
            return JsonResponse({
                'success': False,
                'type': 'error',
                'message': 'An error occurred. Please try again later.',
                'title': 'Server Error'
            }, status=500)


# Keep existing views and update them
class NewsletterView(NewsletterSubscriptionView):
    """Legacy view - redirect to new implementation."""
    pass


class ContactView(ContactFormView):
    """Legacy view - redirect to new implementation."""
    pass
