from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import login, authenticate
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.http import JsonResponse
from django.template.loader import render_to_string
from django.contrib.auth.forms import AuthenticationForm
from .forms import CustomUserCreationForm, UserProfileForm
from .models import UserProfile
from videos.ajax_utils import ajax_response, is_ajax_request


def register(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            # Create user profile
            UserProfile.objects.create(user=user)
            login(request, user)
            
            if is_ajax_request(request):
                return ajax_response(
                    success=True,
                    message='Registration successful! Redirecting...',
                    redirect_url='/'
                )
            
            messages.success(request, 'Your account has been created successfully!')
            return redirect('videos:home')
        else:
            if is_ajax_request(request):
                return ajax_response(
                    success=False,
                    message='Registration failed',
                    context={'errors': form.errors}
                )
    else:
        form = CustomUserCreationForm()
    
    context = {
        'form': form,
        'title': 'Register - YouTube Clone',
        'request': request,
    }
    
    if is_ajax_request(request):
        return ajax_response('accounts/register_partial.html', context)
    
    return render(request, 'accounts/register.html', context)


def custom_login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            
            if user is not None:
                login(request, user)
                
                if is_ajax_request(request):
                    return ajax_response(
                        success=True,
                        message='Login successful! Redirecting...',
                        redirect_url='/'
                    )
                
                messages.success(request, 'Welcome back!')
                return redirect('videos:home')
            else:
                if is_ajax_request(request):
                    return ajax_response(
                        success=False,
                        message='Invalid username or password'
                    )
        else:
            if is_ajax_request(request):
                return ajax_response(
                    success=False,
                    message='Invalid username or password',
                    context={'errors': form.errors}
                )
    else:
        form = AuthenticationForm()
    
    context = {
        'form': form,
        'title': 'Login - YouTube Clone',
        'request': request,
    }
    
    if is_ajax_request(request):
        return ajax_response('accounts/login_partial.html', context)
    
    return render(request, 'accounts/login.html', context)


@login_required
def profile(request):
    profile, created = UserProfile.objects.get_or_create(user=request.user)
    
    if request.method == 'POST':
        form = UserProfileForm(request.POST, request.FILES, instance=profile)
        if form.is_valid():
            form.save()
            messages.success(request, 'Your profile has been updated!')
            return redirect('accounts:profile')
    else:
        form = UserProfileForm(instance=profile)
    
    # Get user's videos
    from videos.models import Video
    user_videos = Video.objects.filter(uploader=request.user).order_by('-upload_date')
    
    context = {
        'form': form,
        'profile': profile,
        'user_videos': user_videos,
    }
    return render(request, 'accounts/profile.html', context)


@login_required
def subscribe(request, user_id):
    from django.contrib.auth.models import User
    target_user = get_object_or_404(User, id=user_id)
    user_profile, created = UserProfile.objects.get_or_create(user=target_user)
    
    if request.user in user_profile.subscribers.all():
        user_profile.subscribers.remove(request.user)
        subscribed = False
    else:
        user_profile.subscribers.add(request.user)
        subscribed = True
    
    return JsonResponse({
        'subscribed': subscribed,
        'subscriber_count': user_profile.subscriber_count
    })


def channel_view(request, username):
    from django.contrib.auth.models import User
    from videos.models import Video
    
    channel_user = get_object_or_404(User, username=username)
    channel_profile, created = UserProfile.objects.get_or_create(user=channel_user)
    videos = Video.objects.filter(uploader=channel_user).order_by('-upload_date')
    
    # Check if current user is subscribed
    is_subscribed = False
    if request.user.is_authenticated:
        is_subscribed = request.user in channel_profile.subscribers.all()
    
    context = {
        'channel_user': channel_user,
        'channel_profile': channel_profile,
        'videos': videos,
        'is_subscribed': is_subscribed,
    }
    return render(request, 'accounts/channel.html', context)
