from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.utils import timezone
from django.contrib import messages
from django.db.models import Q
from .models import Assignment, AssignmentSubmission
from core.models import Group, Subject
from users.models import Teacher, Student


@login_required
def assignment_list(request):
    """Список заданий с фильтрацией по роли"""
    user = request.user
    today = timezone.now().date()

    # Базовая выборка в зависимости от роли
    if user.role == 'teacher':
        teacher = Teacher.objects.get(user=user)
        assignments = Assignment.objects.filter(teacher=teacher)
    elif user.role == 'student':
        student = user.student
        assignments = Assignment.objects.filter(groups=student.group)
    elif user.role == 'parent':
        parent = user.parent
        children = parent.children.all()
        assignments = Assignment.objects.filter(groups__students__in=children).distinct()
    else:  # admin или academic_staff
        assignments = Assignment.objects.all()

    # Фильтры из GET-параметров
    title_filter = request.GET.get('title', '')
    group_filter = request.GET.getlist('group')
    subject_filter = request.GET.getlist('subject')

    if title_filter:
        assignments = assignments.filter(title__icontains=title_filter)
    if group_filter:
        assignments = assignments.filter(groups__id__in=group_filter).distinct()
    if subject_filter:
        assignments = assignments.filter(subject__id__in=subject_filter)

    # Сортировка
    sort_by = request.GET.get('sort', '-deadline')
    assignments = assignments.order_by(sort_by)

    groups = Group.objects.all()
    subjects = Subject.objects.all()

    return render(request, 'assignment_list.html', {
        'assignments': assignments,
        'groups': groups,
        'subjects': subjects,
        'title_filter': title_filter,
        'selected_groups': group_filter,
        'selected_subjects': subject_filter,
        'today': today,
    })


@login_required
def create_assignment(request):
    """Создание задания (с учётом ролей)"""
    user = request.user

    if user.role not in ['teacher', 'academic_staff', 'admin']:
        messages.error(request, 'У вас нет прав на создание заданий')
        return redirect('dashboard')

    # Доступные предметы и группы в зависимости от роли
    if user.role == 'teacher':
        teacher = Teacher.objects.get(user=user)
        available_subjects = teacher.subjects.all()
        available_groups = Group.objects.filter(
            Q(curator=teacher) | Q(schedule_items__teacher=teacher)
        ).distinct()
    else:  # admin или academic_staff
        available_subjects = Subject.objects.all()
        available_groups = Group.objects.all()

    if request.method == 'POST':
        groups = request.POST.getlist('groups')
        subject_id = request.POST.get('subject')
        title = request.POST.get('title')
        description = request.POST.get('description', '')
        deadline = request.POST.get('deadline')
        material_file = request.FILES.get('material_file')
        material_link = request.POST.get('material_link', '')
        material_text = request.POST.get('material_text', '')

        if not groups or not subject_id or not title or not deadline:
            messages.error(request, 'Заполните все обязательные поля')
            return redirect('create_assignment')

        # Определяем преподавателя
        if user.role in ['admin', 'academic_staff']:
            teacher_id = request.POST.get('teacher_id')
            if not teacher_id:
                messages.error(request, 'Выберите преподавателя')
                return redirect('create_assignment')
            teacher = get_object_or_404(Teacher, id=teacher_id)
        else:
            teacher = Teacher.objects.get(user=user)

        assignment = Assignment.objects.create(
            subject_id=subject_id,
            teacher=teacher,
            title=title,
            description=description,
            deadline=deadline,
            material_file=material_file,
            material_link=material_link,
            material_text=material_text,
        )
        assignment.groups.set(groups)

        messages.success(request, f'Задание "{assignment.title}" создано для {len(groups)} групп')
        return redirect('assignment_list')

    context = {
        'subjects': available_subjects,
        'groups': available_groups,
    }

    # Для админа и учебной части добавляем список всех преподавателей
    if user.role in ['admin', 'academic_staff']:
        context['teachers'] = Teacher.objects.all()

    return render(request, 'create_assignment.html', context)


@login_required
def edit_assignment(request, assignment_id):
    """Редактирование задания"""
    user = request.user
    assignment = get_object_or_404(Assignment, id=assignment_id)

    # Проверка прав
    if user.role == 'teacher':
        teacher = Teacher.objects.get(user=user)
        if assignment.teacher != teacher:
            messages.error(request, 'Вы можете редактировать только свои задания')
            return redirect('assignment_list')
    elif user.role not in ['academic_staff', 'admin']:
        messages.error(request, 'У вас нет прав на редактирование')
        return redirect('dashboard')

    # Доступные предметы и группы
    if user.role == 'teacher':
        teacher = Teacher.objects.get(user=user)
        available_subjects = teacher.subjects.all()
        available_groups = Group.objects.filter(
            Q(curator=teacher) | Q(schedule_items__teacher=teacher)
        ).distinct()
    else:
        available_subjects = Subject.objects.all()
        available_groups = Group.objects.all()

    if request.method == 'POST':
        assignment.title = request.POST.get('title')
        assignment.description = request.POST.get('description', '')
        assignment.deadline = request.POST.get('deadline')
        assignment.material_link = request.POST.get('material_link', '')
        assignment.material_text = request.POST.get('material_text', '')
        assignment.subject_id = request.POST.get('subject')

        # Обработка файла
        if request.FILES.get('material_file'):
            assignment.material_file = request.FILES.get('material_file')
        elif request.POST.get('remove_file') == 'on':
            if assignment.material_file:
                assignment.material_file.delete()
                assignment.material_file = None

        assignment.save()
        assignment.groups.set(request.POST.getlist('groups'))

        messages.success(request, 'Задание обновлено')
        return redirect('assignment_list')

    context = {
        'assignment': assignment,
        'subjects': available_subjects,
        'groups': available_groups,
    }

    if user.role in ['admin', 'academic_staff']:
        context['teachers'] = Teacher.objects.all()

    return render(request, 'edit_assignment.html', context)


@login_required
def delete_assignment(request, assignment_id):
    """Удаление задания"""
    user = request.user

    if user.role not in ['teacher', 'academic_staff', 'admin']:
        messages.error(request, 'У вас нет прав на удаление')
        return redirect('dashboard')

    assignment = get_object_or_404(Assignment, id=assignment_id)

    # Преподаватель может удалять только свои задания
    if user.role == 'teacher':
        teacher = Teacher.objects.get(user=user)
        if assignment.teacher != teacher:
            messages.error(request, 'Вы можете удалять только свои задания')
            return redirect('assignment_list')

    assignment.delete()
    messages.success(request, 'Задание удалено')
    return redirect('assignment_list')


@login_required
def my_assignments(request):
    """Список заданий для студента"""
    if request.user.role != 'student':
        return redirect('assignment_list')

    student = request.user.student
    assignments = Assignment.objects.filter(
        groups=student.group,
        deadline__gte=timezone.now().date()
    ).order_by('deadline')

    for assignment in assignments:
        submission = assignment.submissions.filter(student=student).first()
        if submission:
            assignment.submission_status = submission.status
            assignment.submission_id = submission.id
            assignment.answer_text = submission.answer_text
            assignment.answer_file = submission.answer_file
            assignment.grade = submission.grade
            assignment.grade_comment = submission.grade_comment
        else:
            assignment.submission_status = 'not_submitted'
            assignment.submission_id = None

    return render(request, 'my_assignments.html', {
        'assignments': assignments,
        'now': timezone.now(),
    })


@login_required
def submit_assignment(request, assignment_id):
    """Страница сдачи задания студентом"""
    if request.user.role != 'student':
        return redirect('dashboard')

    assignment = get_object_or_404(Assignment, id=assignment_id)
    student = request.user.student

    # Проверяем, что студент в одной из групп задания
    if student.group not in assignment.groups.all():
        messages.error(request, 'Это задание не для вашей группы')
        return redirect('my_assignments')

    submission, created = AssignmentSubmission.objects.get_or_create(
        assignment=assignment,
        student=student,
        defaults={'status': 'not_submitted'}
    )

    can_edit = assignment.deadline >= timezone.now().date()

    if request.method == 'POST':
        action = request.POST.get('action')

        if action == 'save':
            submission.answer_text = request.POST.get('answer_text', '')
            if request.FILES.get('answer_file'):
                submission.answer_file = request.FILES.get('answer_file')
            submission.status = 'submitted'
            submission.submitted_at = timezone.now()
            submission.save()
            messages.success(request, 'Задание сдано на проверку!')
            return redirect('my_assignments')

        elif action == 'delete_file':
            if submission.answer_file:
                submission.answer_file.delete()
                submission.answer_file = None
                submission.save()
                messages.success(request, 'Файл удалён')
                return redirect('submit_assignment', assignment_id=assignment_id)

    return render(request, 'submit_assignment.html', {
        'assignment': assignment,
        'submission': submission,
        'can_edit': can_edit,
        'now': timezone.now(),
    })


@login_required
def grade_submission(request, submission_id):
    """Выставление оценки преподавателем"""
    user = request.user

    if user.role not in ['teacher', 'academic_staff', 'admin']:
        messages.error(request, 'У вас нет прав на выставление оценок')
        return redirect('dashboard')

    submission = get_object_or_404(AssignmentSubmission, id=submission_id)

    # Преподаватель может оценивать только свои задания
    if user.role == 'teacher':
        teacher = Teacher.objects.get(user=user)
        if submission.assignment.teacher != teacher:
            messages.error(request, 'Вы можете оценивать только свои задания')
            return redirect('assignment_list')

    if request.method == 'POST':
        submission.grade = request.POST.get('grade')
        submission.grade_comment = request.POST.get('grade_comment', '')
        submission.status = 'graded'
        submission.graded_at = timezone.now()
        submission.save()
        messages.success(request, 'Оценка выставлена')
        return redirect('assignment_list')

    return render(request, 'grade_submission.html', {'submission': submission})