from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django import forms
from django.urls import reverse
from django.http import HttpResponseRedirect
from .models import User, Student, Teacher, Parent
from core.models import Subject

# Убираем стандартные группы Django из админки
admin.site.unregister(Group)


class UserChangeForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('email', 'role', 'is_active')
        widgets = {
            'role': forms.Select(attrs={'style': 'width: 100%; min-width: 200px; padding: 8px; border-radius: 8px;'}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if 'password' in self.fields:
            self.fields['password'].help_text = 'Оставьте пустым, чтобы не менять пароль. Для смены пароля введите новый.'
            self.fields['password'].label = 'Пароль'


class UserAdmin(BaseUserAdmin):
    form = UserChangeForm
    list_display = ('email', 'get_full_name', 'role')
    list_filter = ('role',)
    search_fields = ('email',)
    ordering = ('email',)

    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Роль', {'fields': ('role',)}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2', 'role'),
        }),
    )

    def get_full_name(self, obj):
        if hasattr(obj, 'student') and obj.student:
            return f"{obj.student.last_name} {obj.student.first_name} {obj.student.middle_name or ''}".strip()
        elif hasattr(obj, 'teacher') and obj.teacher:
            return f"{obj.teacher.last_name} {obj.teacher.first_name} {obj.teacher.middle_name or ''}".strip()
        return obj.email

    get_full_name.short_description = 'ФИО'

    def has_add_permission(self, request):
        if request.path == '/admin/':
            return False
        return True

    def response_add(self, request, obj, post_url_continue=None):
        """После создания пользователя перенаправляем на страницу добавления профиля"""
        if obj.role == 'student':
            # Для студента — на страницу добавления студента
            return HttpResponseRedirect(reverse('admin:users_student_add'))
        elif obj.role == 'teacher':
            # Для преподавателя — на страницу добавления преподавателя
            return HttpResponseRedirect(reverse('admin:users_teacher_add'))
        elif obj.role == 'parent':
            # Для родителя — на страницу добавления родителя
            return HttpResponseRedirect(reverse('admin:users_parent_add'))
        else:
            # Для учебной части и админа — просто в список пользователей
            return super().response_add(request, obj, post_url_continue)


class StudentAdminForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = '__all__'
        widgets = {
            'user': forms.Select(),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['user'].queryset = User.objects.filter(role='student')
        self.fields['user'].label_from_instance = lambda obj: f"{obj.email}"


class TeacherAdminForm(forms.ModelForm):
    class Meta:
        model = Teacher
        fields = '__all__'
        widgets = {
            'user': forms.Select(),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['user'].queryset = User.objects.filter(role='teacher')
        self.fields['user'].label_from_instance = lambda obj: f"{obj.email}"
        self.fields['subjects'].queryset = Subject.objects.all()
        self.fields['subjects'].required = False


class ParentAdminForm(forms.ModelForm):
    class Meta:
        model = Parent
        fields = '__all__'
        widgets = {
            'user': forms.Select(),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['user'].queryset = User.objects.filter(role='parent')
        self.fields['user'].label_from_instance = lambda obj: f"{obj.email}"
        self.fields['children'].queryset = Student.objects.all()


@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
    form = StudentAdminForm
    list_display = ('last_name', 'first_name', 'middle_name', 'group', 'enrollment_year', 'has_job', 'receives_scholarship')
    list_filter = ('group', 'has_job', 'receives_scholarship')
    search_fields = ('last_name', 'first_name', 'middle_name')

    fieldsets = (
        ('Личная информация', {
            'fields': ('user', 'last_name', 'first_name', 'middle_name', 'birth_date', 'phone', 'address')
        }),
        ('Учебная информация', {
            'fields': ('group', 'enrollment_year', 'student_id_number', 'has_job', 'job_place', 'receives_scholarship', 'scholarship_type')
        }),
    )

    def has_add_permission(self, request):
        if request.path == '/admin/':
            return False
        return True


@admin.register(Teacher)
class TeacherAdmin(admin.ModelAdmin):
    form = TeacherAdminForm
    list_display = ('last_name', 'first_name', 'middle_name', 'position', 'department', 'get_groups_curated')
    list_filter = ('department',)
    search_fields = ('last_name', 'first_name', 'middle_name')
    filter_horizontal = ('subjects',)

    fieldsets = (
        ('Личная информация', {
            'fields': ('user', 'last_name', 'first_name', 'middle_name', 'birth_date', 'phone')
        }),
        ('Рабочая информация', {
            'fields': ('position', 'department', 'subjects', 'hire_date')
        }),
    )

    def has_add_permission(self, request):
        if request.path == '/admin/':
            return False
        return True

    def get_groups_curated(self, obj):
        groups = obj.curated_groups.all()
        return ", ".join([g.name for g in groups]) if groups else "—"

    get_groups_curated.short_description = 'Курирует группы'


@admin.register(Parent)
class ParentAdmin(admin.ModelAdmin):
    form = ParentAdminForm
    list_display = ('last_name', 'first_name', 'middle_name', 'phone', 'get_children')
    search_fields = ('last_name', 'first_name', 'middle_name')
    filter_horizontal = ('children',)

    fieldsets = (
        ('Личная информация', {
            'fields': ('user', 'last_name', 'first_name', 'middle_name', 'birth_date', 'phone', 'address')
        }),
        ('Дети', {
            'fields': ('children',)
        }),
    )

    def has_add_permission(self, request):
        if request.path == '/admin/':
            return False
        return True

    def get_children(self, obj):
        return ", ".join([f"{c.last_name} {c.first_name}" for c in obj.children.all()])

    get_children.short_description = 'Дети'


admin.site.register(User, UserAdmin)