from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from django.contrib import messages
from django.db import IntegrityError
from django.contrib import messages
from django.contrib.auth.decorators import login_required, user_passes_test
from .models import Student, TestAttendance
from datetime import date
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.paginator import Paginator
from django.db.models import Avg, Count, Q

from .models import (
    COURSE_CHOICES, Student, PortfolioItem, TestAttendance, PerformanceRating,
    Assignment, COURSE_PRICES
)
from .forms import RegistrationForm, AssignmentUploadForm, LoginForm

TEST_ORDER = ['test1', 'test2', 'test3', 'exam']
TEST_LABELS = {
    'test1': 'Test 1',
    'test2': 'Test 2',
    'test3': 'Test 3',
    'exam': 'Final Exam',
}

def is_admin(user):
    return user.is_staff or user.is_superuser

def home(request):
    """Landing page with carousel and course info."""
    portfolio_graphics = PortfolioItem.objects.filter(category='graphics')[:6]
    portfolio_digital = PortfolioItem.objects.filter(category='digital_art')[:6]
    portfolio_photo = PortfolioItem.objects.filter(category='photography')[:6]
    portfolio_program = PortfolioItem.objects.filter(category='programming')[:6]
    
    context = {
        'portfolio_graphics': portfolio_graphics,
        'portfolio_digital': portfolio_digital,
        'portfolio_photo': portfolio_photo,
        'portfolio_programming': portfolio_program,
        'prices': COURSE_PRICES,
    }
    return render(request, 'academy/home.html', context)


def portfolio(request):
    """Full portfolio page."""
    category = request.GET.get('category', 'all')
    if category != 'all':
        items = PortfolioItem.objects.filter(category=category)
    else:
        items = PortfolioItem.objects.all()
    context = {
        'items': items,
        'active_category': category,
    }
    return render(request, 'academy/portfolio.html', context)


def register(request):
    """Student registration."""
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            # Check if email already exists
            email = form.cleaned_data['email']
            if Student.objects.filter(email=email).exists():
                form.add_error('email', 'A student with this email is already registered.')
            else:
                student = form.save(commit=False)
                password = form.cleaned_data['password']

                # Create Django user
                username = email.split('@')[0]
                base_username = username
                counter = 1
                while User.objects.filter(username=username).exists():
                    username = f"{base_username}{counter}"
                    counter += 1

                user = User.objects.create_user(
                    username=username,
                    email=email,
                    password=password,
                    first_name=student.full_name.split()[0],
                    last_name=' '.join(student.full_name.split()[1:]) if len(student.full_name.split()) > 1 else '',
                )
                student.user = user
                student.save()

                # Create test attendance records
                for test_type in TEST_ORDER:
                    TestAttendance.objects.create(student=student, test_type=test_type)

                # Create performance record
                PerformanceRating.objects.create(student=student)

                request.session['new_student_id'] = student.id
                return redirect('registration_success')
    else:
        form = RegistrationForm()

    return render(request, 'academy/register.html', {'form': form, 'prices': COURSE_PRICES})


def registration_success(request):
    """Success page after registration with payment instructions."""
    student_id = request.session.get('new_student_id')
    student = None
    if student_id:
        try:
            student = Student.objects.get(id=student_id)
        except Student.DoesNotExist:
            pass
    return render(request, 'academy/registration_success.html', {'student': student})


def student_login(request):
    """Login view."""
    if request.user.is_authenticated:
        return redirect('dashboard')

    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']

            try:
                user = User.objects.get(email=email)
                user = authenticate(request, username=user.username, password=password)
                if user:
                    login(request, user)
                    return redirect('dashboard')
                else:
                    form.add_error(None, 'Incorrect password.')
            except User.DoesNotExist:
                form.add_error('email', 'No account found with this email.')
    else:
        form = LoginForm()

    return render(request, 'academy/login.html', {'form': form})


def student_logout(request):
    logout(request)
    return redirect('home')


def dashboard(request):
    """Student dashboard."""
    if not request.user.is_authenticated:
        return redirect('login')

    try:
        student = request.user.student
    except Student.DoesNotExist:
        messages.error(request, 'No student profile found for your account.')
        return redirect('admin_dashboard' if request.user.is_staff or request.user.is_superuser else 'home')

    # Get test attendances in order
    attendances = {}
    for ta in student.attendances.all():
        attendances[ta.test_type] = ta

    test_data = []
    for key in TEST_ORDER:
        ta = attendances.get(key)
        test_data.append({
            'key': key,
            'label': TEST_LABELS[key],
            'completed': ta.completed if ta else False,
            'is_exam': key == 'exam',
        })

    # Performance
    try:
        performance = student.performance
    except PerformanceRating.DoesNotExist:
        performance = None

    # Assignments
    assignments = student.assignments.all()

    # Upload form
    if request.method == 'POST':
        upload_form = AssignmentUploadForm(request.POST, request.FILES)
        if upload_form.is_valid():
            assignment = upload_form.save(commit=False)
            assignment.student = student
            assignment.save()
            messages.success(request, 'Assignment uploaded successfully!')
            return redirect('dashboard')
    else:
        upload_form = AssignmentUploadForm()

    context = {
        'student': student,
        'test_data': test_data,
        'performance': performance,
        'assignments': assignments,
        'upload_form': upload_form,
    }
    return render(request, 'academy/dashboard.html', context)


# Add these imports at the top




@login_required
@user_passes_test(is_admin)
def admin_dashboard(request):
    """Main Admin Dashboard"""
    total_students = Student.objects.count()
    confirmed_payments = Student.objects.filter(payment_confirmed=True).count()
    pending_payments = total_students - confirmed_payments

    # Recent registrations
    recent_students = Student.objects.select_related('user').order_by('-registered_at')[:10]

    # Performance overview
    performance_summary = PerformanceRating.objects.aggregate(
        avg_score=Avg('score'),
        total_rated=Count('id')
    )

    # Test completion stats
    test_stats = []
    for test_type in TEST_ORDER:
        completed = TestAttendance.objects.filter(
            test_type=test_type, completed=True
        ).count()
        total = TestAttendance.objects.filter(test_type=test_type).count()
        test_stats.append({
            'label': TEST_LABELS[test_type],
            'completed': completed,
            'total': total,
            'percentage': round((completed / total * 100), 1) if total > 0 else 0
        })

    context = {
        'total_students': total_students,
        'confirmed_payments': confirmed_payments,
        'pending_payments': pending_payments,
        'recent_students': recent_students,
        'performance_summary': performance_summary,
        'test_stats': test_stats,
    }
    return render(request, 'academy/admin/dashboard.html', context)


@login_required
@user_passes_test(is_admin)
def admin_students(request):
    """List all students with search and filter"""
    query = request.GET.get('q', '')
    course_filter = request.GET.get('course', '')
    payment_filter = request.GET.get('payment', '')

    students = Student.objects.select_related('user', 'performance').order_by('-registered_at')

    if query:
        students = students.filter(
            Q(full_name__icontains=query) |
            Q(email__icontains=query) |
            Q(phone_number__icontains=query)
        )

    if course_filter:
        students = students.filter(course=course_filter)

    if payment_filter == 'paid':
        students = students.filter(payment_confirmed=True)
    elif payment_filter == 'pending':
        students = students.filter(payment_confirmed=False)

    paginator = Paginator(students, 20)
    page_number = request.GET.get('page')
    students_page = paginator.get_page(page_number)

    context = {
        'students': students_page,
        'query': query,
        'course_filter': course_filter,
        'payment_filter': payment_filter,
        'COURSE_CHOICES': COURSE_CHOICES,
    }
    return render(request, 'academy/admin/students.html', context)


@login_required
@user_passes_test(is_admin)
def admin_student_detail(request, student_id):
    """View and update single student details"""
    student = get_object_or_404(Student, id=student_id)
    performance = getattr(student, 'performance', None)
    assignments = student.assignments.all()
    attendances = {ta.test_type: ta for ta in student.attendances.all()}

    if request.method == 'POST':
        if 'mark_payment' in request.POST:
            student.payment_confirmed = True
            student.save()
            messages.success(request, 'Payment marked as confirmed.')
            return redirect('admin_student_detail', student_id=student.id)

        elif 'update_performance' in request.POST:
            score = int(request.POST.get('score', 0))
            remarks = request.POST.get('remarks', '')
            if performance:
                performance.score = score
                performance.remarks = remarks
                performance.save()
            else:
                PerformanceRating.objects.create(student=student, score=score, remarks=remarks)
            messages.success(request, 'Performance updated successfully.')
            return redirect('admin_student_detail', student_id=student.id)

    context = {
        'student': student,
        'performance': performance,
        'assignments': assignments,
        'attendances': attendances,
        'TEST_LABELS': TEST_LABELS,
        'TEST_ORDER': TEST_ORDER,
    }
    return render(request, 'academy/admin/student_detail.html', context)


@login_required
@user_passes_test(is_admin)
def admin_portfolio(request):
    """Manage Portfolio Items"""
    items = PortfolioItem.objects.all().order_by('-created_at')
    context = {'items': items}
    return render(request, 'academy/admin/portfolio.html', context)


@login_required
@user_passes_test(is_admin)
def admin_assignments(request):
    """View all submitted assignments"""
    assignments = Assignment.objects.select_related('student').order_by('-submitted_at')
    context = {'assignments': assignments}
    return render(request, 'academy/admin/assignments.html', context)


def review_assignment(request, id):
    assignment = get_object_or_404(Assignment, id=id)

    context = {
        'assignment': assignment
    }
    return render(request, 'admin/review_assignment.html', context)

# academy/views.py

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required, user_passes_test
from django.contrib import messages
from .models import PortfolioItem
from .forms import PortfolioForm

def is_staff(user):
    return user.is_staff or user.is_superuser


@login_required
@user_passes_test(is_staff)
def admin_portfolio_list(request):
    items = PortfolioItem.objects.all().order_by('-created_at')
    context = {'items': items}
    return render(request, 'academy/admin_portfolio.html', context)


@login_required
@user_passes_test(is_staff)
def admin_portfolio_add(request):
    if request.method == 'POST':
        form = PortfolioForm(request.POST, request.FILES)
        if form.is_valid():
            item = form.save()
            messages.success(request, f'Portfolio item "{item.title}" added successfully!')
            return redirect('admin_portfolio')
    else:
        form = PortfolioForm()
    
    context = {
        'form': form,
        'title': 'Add New Portfolio Item'
    }
    return render(request, 'academy/admin_portfolio_form.html', context)


@login_required
@user_passes_test(is_staff)
def admin_portfolio_edit(request, pk):
    item = get_object_or_404(PortfolioItem, pk=pk)
    
    if request.method == 'POST':
        form = PortfolioForm(request.POST, request.FILES, instance=item)
        if form.is_valid():
            item = form.save()
            messages.success(request, f'Portfolio item "{item.title}" updated successfully!')
            return redirect('admin_portfolio')
    else:
        form = PortfolioForm(instance=item)
    
    context = {
        'form': form,
        'title': 'Edit Portfolio Item',
        'item': item
    }
    return render(request, 'academy/admin_portfolio_form.html', context)


@login_required
@user_passes_test(is_staff)
def admin_portfolio_delete(request, pk):
    item = get_object_or_404(PortfolioItem, pk=pk)
    
    if request.method == 'POST':
        title = item.title
        item.delete()
        messages.success(request, f'Portfolio item "{title}" deleted successfully.')
        return redirect('admin_portfolio')
    
    context = {'item': item}
    return render(request, 'academy/admin_portfolio_confirm_delete.html', context)




def is_staff(user):
    return user.is_staff or user.is_superuser


@login_required
@user_passes_test(is_staff)
def toggle_test_attendance(request, student_id, test_type):
    student = get_object_or_404(Student, id=student_id)
    
    # Validate test_type
    valid_types = ["test1", "test2", "test3", "exam"]
    if test_type not in valid_types:
        messages.error(request, "Invalid test type.")
        return redirect('admin_student_detail', student.id)

    attendance, created = TestAttendance.objects.get_or_create(
        student=student,
        test_type=test_type
    )

    if request.method == 'POST':
        if not attendance.completed:
            attendance.completed = True
            attendance.date_completed = date.today()
            attendance.save()
            messages.success(request, f"{attendance.get_test_type_display()} marked as completed.")
        else:
            # Optional: Allow unmarking
            attendance.completed = False
            attendance.date_completed = None
            attendance.save()
            messages.info(request, f"{attendance.get_test_type_display()} marked as pending.")

    return redirect('admin_student_detail', student.id)