import logging
from django.shortcuts import render, redirect
from django.contrib import messages
from django.db import IntegrityError
from django.utils.translation import gettext as _
from rest_framework.decorators import action
from rest_framework import viewsets
from rest_framework.permissions import AllowAny
from django.contrib.auth.models import User

from ..models import Profile
from ..forms import SignupForm
from .base import DummySerializer

logger = logging.getLogger(__name__)


class SignupViewSet(viewsets.ViewSet):
    permission_classes = (AllowAny,)
    serializer_class = DummySerializer

    @action(detail=False, methods=['GET', 'POST'], url_path=r'signup')
    def signup(self, request):
        base_domain = request.build_absolute_uri('/')
        
        # Check if user came from social auth and needs profile completion
        social_login = request.user.is_authenticated and not hasattr(request.user, 'profile')
        
        # If user is authenticated and has profile, redirect to homepage
        if request.user.is_authenticated and hasattr(request.user, 'profile'):
            messages.info(request, _("You are already logged in."))
            return redirect('/')

        if request.method == 'POST':
            if social_login:
                # Social login completion
                form = SignupForm(request.POST, social_login=True)
            else:
                # Manual registration
                form = SignupForm(request.POST)
            
            if form.is_valid():
                cleaned_data = form.cleaned_data
                email = cleaned_data['email']
                is_social_login = cleaned_data.get('social_login', False)
                
                try:
                    if is_social_login and request.user.is_authenticated:
                        # Social login completion
                        user = request.user
                        
                        # Update user email if different
                        if user.email != email:
                            user.email = email
                            user.save()
                        
                        # Create profile
                        profile, created = Profile.objects.get_or_create(
                            user=user,
                            defaults={
                                'email': email,
                                'agreed_to_terms': cleaned_data['agreed_to_terms']
                            }
                        )
                        
                        if created:
                            messages.success(request, _("Account setup complete! Welcome to our platform!"))
                        else:
                            messages.info(request, _("Welcome back!"))
                        
                        return redirect('/')
                        
                    else:
                        # Manual registration
                        if User.objects.filter(email=email).exists():
                            emailError = _("An account with this email already exists. Please log in instead.")
                            return render(request, 'signup.html', {
                                'form': form, 
                                'emailError': emailError, 
                                'base_domain': base_domain
                            })
                        
                        # Create user with unique username
                        username = email
                        counter = 1
                        while User.objects.filter(username=username).exists():
                            username = f"{email.split('@')[0]}{counter}"
                            counter += 1
                        
                        user = User.objects.create_user(
                            username=username,
                            email=email,
                            password=cleaned_data['password1']
                        )
                        
                        # Create profile
                        Profile.objects.create(
                            user=user,
                            email=email,
                            agreed_to_terms=cleaned_data['agreed_to_terms']
                        )
                        
                        messages.success(request, _("Account created successfully! Please log in to continue."))
                        return redirect(f'{base_domain}login/')

                except IntegrityError as e:
                    logger.error(f"IntegrityError during signup: {e}")
                    messages.error(request, _("There was an error creating your account. Please try again."))
                except Exception as e:
                    logger.error(f"Error during signup: {e}")
                    messages.error(request, _("An unexpected error occurred. Please try again."))

            else:
                # Form validation failed
                return render(request, 'signup.html', {
                    'form': form,
                    'emailError': "",
                    'base_domain': base_domain
                })

        else:
            # GET request
            if social_login:
                # Pre-populate for social auth completion
                form = SignupForm(initial={
                    'email': request.user.email,
                    'social_login': True
                }, social_login=True)
            else:
                form = SignupForm()
            
            return render(request, 'signup.html', {
                'form': form, 
                'emailError': "", 
                'base_domain': base_domain
            })