from django.contrib.auth.decorators import login_required, user_passes_test
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth import authenticate, login, logout
from django.views.generic import DetailView, DeleteView, UpdateView, CreateView, TemplateView, ListView
from app.models import *
from django.utils import translation
from django.conf import settings
import logging
import requests
from django.http import JsonResponse
from typing import Any
from django.contrib import messages
from app.forms import *



def error_404(request, exception):
    return render(request, '404.html', status=404)





logger = logging.getLogger(__name__)

# ================= Admin Check =================
def is_admin(user):
    return user.is_authenticated and (user.is_staff or user.is_superuser)


# Create your views here.

def set_language(request):
    lang_code = request.POST.get('language')
    next_url = request.POST.get('next', '/')
    
    if lang_code and lang_code in dict(settings.LANGUAGES):
        # Agar URL til prefiksi bilan boshlangan bo'lsa, uni yangisiga almashtiramiz
        if next_url.startswith('/uz/') or next_url.startswith('/ru/') or next_url.startswith('/en/'):
            next_url = f'/{lang_code}{next_url[3:]}'
        elif next_url in ['/uz', '/ru', '/en', '/uz/', '/ru/', '/en/']:
            next_url = f'/{lang_code}/'
        
        response = redirect(next_url)
        translation.activate(lang_code)
        response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
        if hasattr(request, 'session'):
            request.session[translation.LANGUAGE_SESSION_KEY] = lang_code
        return response
    
    return redirect(next_url)






class DashboardView(TemplateView):
    template_name = "_dashboard/index.html"

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx["news_count"] = News.objects.count()
        ctx["elon_count"] = Elon.objects.count()
        ctx["faculty_count"] = Faculty.objects.count()
        ctx["contact_count"] = ContactMessage.objects.count()
        return ctx






def login_view(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")

        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            return redirect("main:dashboard")
        else:
            messages.error(request, _("Login yoki parol noto‘g‘ri"))

    return render(request, "_dashboard/login.html")


def logout_view(request):
    logout(request)
    return redirect("main:login")


# ================= INDEX =================
class IndexView(TemplateView):
    template_name = "index.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["ekran_images"] = EkranImages.objects.all()
        # So'nggi yangiliklar (3 ta)
        context["news_list"] = News.objects.all().order_by("-published_date")[:3]
        # So'nggi e'lonlar (3 ta)
        context["elon_list"] = Elon.objects.all().order_by("-published_date")[:3]
        # Fakultetlar (birinchi 3 ta)
        context["faculties"] = Faculty.objects.all()[:3]
        # Universitet haqida (birinchi obyekt)
        context["about_university"] = AboutUniversity.objects.prefetch_related("features").first()
        # Universitet tuzilmasi (statistika uchun)
        context["university_structure"] = UniversityStructure.objects.all()
        # Galereya
        context["gallery"] = galareyaIMG.objects.all()
        # Hamkorlar
        context["partners"] = Partner.objects.all().order_by("order")
        return context

    

    
    

class UnivertView(TemplateView):
    template_name = "about/universitet.html"
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["university_structure"] = UniversityStructure.objects.all()
        return context


class AboutView(TemplateView):
    template_name = "about/about.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["about_university"] = AboutUniversity.objects.prefetch_related("features").first()
        context["university_values"] = UniversityValue.objects.all().order_by("type", "order")
        return context
       
    
class HistoryView(TemplateView):
    template_name = "about/history.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["university_history"] = UniversityHistory.objects.all().order_by("year")
        context["university_achievements"] = UniversityAchievement.objects.all().order_by("order")
        return context
    

class AloqaView(TemplateView):
    template_name = "about/aloqa.html"

    def get_context_data(self, **kwargs) -> dict[str, Any]:
        context = super().get_context_data(**kwargs)
        context["contact_category"] = CallUserCategory.objects.all()
        context["contact"] = CallLink.objects.first()
        return context

    def post(self, request, *args, **kwargs):
        name = request.POST.get("name")
        phone = request.POST.get("phone")
        email = request.POST.get("email")
        message = request.POST.get("message")

        # Bazaga saqlash
        ContactMessage.objects.create(
            name=name,
            phone=phone,
            email=email,
            message=message
        )

        messages.success(request, _("Xabaringiz yuborildi!"))
        return redirect("main:AloqaView")
 
# ================= Yangiliklar ============ 

class NewsView(ListView):
    model = News
    template_name = "news/news.html"
    context_object_name = "news_list"
    ordering = ['-published_date']
    paginate_by = 6
   
    
class NewsDetailView(DetailView):
    model = News
    template_name = "news/news_detail.html"
    context_object_name = "news"
    slug_field = "slug"
    slug_url_kwarg = "slug"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        news = self.object

        context["gallery"] = news.gallery.all()

        # O'xshash yangiliklar (oxirgi 3 ta, o'zidan tashqari)
        context["related_news"] = News.objects.exclude(id=news.id).order_by("-published_date")[:3]

        return context

# ================= Elonlar =================    

class ElonListView(ListView):
    model = Elon
    template_name = "news/elon.html"
    context_object_name = "elon_list"
    ordering = ['-published_date']
    paginate_by = 6

class ElonDetailView(DetailView):
    model = Elon
    template_name = "news/elon_detail.html"
    context_object_name = "elon"
    slug_field = "slug"
    slug_url_kwarg = "slug"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        elon = self.object

        context["gallery"] = elon.gallery.all()

        # O'xshash elonlar (oxirgi 3 ta)
        context["related_elons"] = Elon.objects.exclude(id=elon.id).order_by("-published_date")[:3]

        return context
    
# ================= Rektorat =================    
    
class RektoratView(TemplateView):
    template_name = "rektorat/rektorat.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["rectors"] = Rector.objects.filter(is_active=True)
        return context

 
class RektoratDetailView(DetailView):
    model = Rector
    template_name = "rektorat/leader_detail.html"
    context_object_name = "rector"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        rector = self.object

        context["educations"] = rector.educations.all()
        context["experiences"] = rector.experiences.all()
        context["social_links"] = rector.social_links.all()

        # OneToOne
        context["stat"] = getattr(rector, "scientific_stat", None)

        # Sidebar uchun boshqa rahbarlar
        context["other_leaders"] = Rector.objects.filter(is_active=True).exclude(id=rector.id)[:3]

        return context


# ================= Fakultet, Kafedralar, Ilmiy markazlar =================

class FakultetView(ListView):
    model = Faculty
    template_name = "fakultet/fakultet.html"
    context_object_name = "faculties"

class FacultyDetailView(DetailView):
    model = Faculty
    template_name = "fakultet/fakultet_detail.html"
    context_object_name = "faculty"
    slug_field = "slug"
    slug_url_kwarg = "slug"

class KafedraView(ListView):
    model = Department
    template_name = "fakultet/kafedra.html"
    context_object_name = "departments"

class DepartmentDetailView(DetailView):
    model = Department
    template_name = "fakultet/kafedra_detail.html"
    context_object_name = "department"
    slug_field = "slug"
    slug_url_kwarg = "slug"

class BolimView(ListView):
    model = ResearchCenter
    template_name = "fakultet/bolimlar.html"
    context_object_name = "research_centers"

class BolimDetailView(DetailView):
    model = ResearchCenter
    template_name = "fakultet/bolimlar_detail.html"
    context_object_name = "center"
    slug_field = "slug"
    slug_url_kwarg = "slug"


# ================= Professorlar =================

class ProfessorsView(TemplateView):
    template_name = "fakultet/professors-today.html"

    def get_context_data(self, **kwargs):
        from django.utils import timezone
        context = super().get_context_data(**kwargs)
        
        # Today's distinguished professors (Faculty staff and Department staff who are leaders)
        # These are the strongest/most distinguished teachers
        today_faculty_leaders = FacultyStaff.objects.filter(is_leader=True).order_by("order")[:3]
        today_dept_leaders = DepartmentStaff.objects.filter(is_leader=True).order_by("order")[:3]
        today_research_leaders = ResearchCenterStaff.objects.filter(is_leader=True).order_by("order")[:3]
        
        # Combine all distinguished professors
        distinguished = list(today_faculty_leaders) + list(today_dept_leaders) + list(today_research_leaders)
        context["today_distinguished_professors"] = distinguished[:6]  # Show up to 6
        
        # Group all professors by faculty
        professors_by_faculty = {}
        
        for faculty in Faculty.objects.all():
            staff_list = FacultyStaff.objects.filter(faculty=faculty).order_by("order")
            if staff_list.exists():
                professors_by_faculty[faculty] = staff_list
        
        # Also add department staff grouped by their faculty's department
        for department in Department.objects.select_related('faculty').all():
            if department.faculty and department.faculty not in professors_by_faculty:
                professors_by_faculty[department.faculty] = []
            
            dept_staff = DepartmentStaff.objects.filter(department=department).order_by("order")
            if dept_staff.exists():
                if department.faculty:
                    if isinstance(professors_by_faculty.get(department.faculty), list):
                        professors_by_faculty[department.faculty].extend(dept_staff)
                    else:
                        professors_by_faculty[department.faculty] = list(professors_by_faculty[department.faculty]) + list(dept_staff)
        
        context["professors_by_faculty"] = professors_by_faculty
        
        return context


# ================= faoliyat =================

class FaoliyatView(TemplateView):
    template_name = "faoliyat/faoliyat.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        context["scientific_stats"] = ScientificStat.objects.all()
        context["research_centers"] = ResearchCenter.objects.all()

        latest_year = PublicationStat.objects.order_by("-year").values_list("year", flat=True).first()
        context["publication_stats"] = PublicationStat.objects.filter(year=latest_year)
        context["publication_year"] = latest_year

        context["educational_documents"] = EducationalDocument.objects.all()

        return context


# ================= xalqaro =================
class XalqaroView(TemplateView):
    template_name = "faoliyat/xalqaro.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["countries"] = PartnerCountry.objects.prefetch_related("universities")
        context["programs"] = CooperationProgram.objects.all()
        return context


# ================= Loyihalar =================
class LoyihaView(TemplateView):
    template_name = "faoliyat/loyihalar.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["projects"] = Project.objects.select_related("category").filter(is_active=True)
        return context


# ================= Talim =================
class TalimView(TemplateView):
    template_name = "talim/talim.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["bachelor_categories"] = BachelorCategory.objects.prefetch_related("programs")
        context["master_categories"] = MasterCategory.objects.prefetch_related("programs")
        return context

# ================= Qabul =================
class QabulView(TemplateView):
    template_name = "talim/qabul.html"

# ================= Students =================
class StudentsView(TemplateView):
    template_name = "students/talabalar.html"
@login_required
@user_passes_test(is_admin)
def news_create_view(request):
    if request.method == "POST":
        form = NewsForm(request.POST, request.FILES)
        image_formset = NewsImageFormSet(request.POST, request.FILES, prefix="images")

        if (
            form.is_valid() and
            image_formset.is_valid()
        ):
            news = form.save()

            image_formset.instance = news

            image_formset.save()

            messages.success(request, _("Yangilik saqlandi"))
            return redirect("main:news_list")

        else:
            messages.error(request, _("Formada xatolik bor"))

    else:
        form = NewsForm()
        image_formset = NewsImageFormSet(prefix="images")

    return render(request, "_dashboard/news/news_create.html", {
        "form": form,
        "image_formset": image_formset,
    })


@login_required
@user_passes_test(is_admin)
def news_list_view(request):
    news_list = News.objects.order_by("-id")
    return render(request, "_dashboard/news/news.html", {"news_list": news_list})


@login_required
@user_passes_test(is_admin)
def news_edit_view(request, pk):
    news = get_object_or_404(News, pk=pk)

    if request.method == "POST":
        form = NewsForm(request.POST, request.FILES, instance=news)
        image_formset = NewsImageFormSet(request.POST, request.FILES, instance=news, prefix="images")

        if form.is_valid() and image_formset.is_valid():
            form.save()
            image_formset.save()
            messages.success(request, _("Yangilandi"))
            return redirect("main:news_list")

    else:
        form = NewsForm(instance=news)
        image_formset = NewsImageFormSet(instance=news, prefix="images")

    return render(request, "_dashboard/news/news_edit.html", {
        "form": form,
        "image_formset": image_formset,
    })





@login_required
@user_passes_test(is_admin)
def news_delete_view(request, pk):
    news = get_object_or_404(News, pk=pk)
    news.delete()
    messages.success(request, _("Yangilik o‘chirildi"))
    return redirect("main:news_list")










@login_required
@user_passes_test(is_admin)
def elon_list_view(request):
    elon_list = Elon.objects.order_by("-id")
    return render(request, "_dashboard/elon/elon.html", {"elon_list": elon_list})



@login_required
@user_passes_test(is_admin)
def elon_create_view(request):
    if request.method == "POST":
        form = ElonForm(request.POST, request.FILES)
        image_formset = ElonImageFormSet(request.POST, request.FILES, prefix="images")

        if (
            form.is_valid() and
            image_formset.is_valid()
        ):
            elon = form.save()

            image_formset.instance = elon

            image_formset.save()

            messages.success(request, _("E’lon qo‘shildi"))
            return redirect("elon_list")
        else:
            messages.error(request, _("Formada xatolik bor. Iltimos tekshiring."))

    else:
        form = ElonForm()
        image_formset = ElonImageFormSet(prefix="images")

    return render(request, "_dashboard/elon/elon_create.html", {
        "form": form,
        "image_formset": image_formset,
    })


@login_required
@user_passes_test(is_admin)
def elon_edit_view(request, pk):
    elon = get_object_or_404(Elon, pk=pk)

    if request.method == "POST":
        form = ElonForm(request.POST, request.FILES, instance=elon)
        image_formset = ElonImageFormSet(request.POST, request.FILES, instance=elon, prefix="images")

        if (
            form.is_valid() and
            image_formset.is_valid()
        ):
            form.save()
            image_formset.save()

            messages.success(request, _("E’lon yangilandi"))
            return redirect("elon_list")
        else:
            messages.error(request, _("Formada xatolik bor. Iltimos tekshiring."))

    else:
        form = ElonForm(instance=elon)
        image_formset = ElonImageFormSet(instance=elon, prefix="images")

    return render(request, "_dashboard/elon/elon_edit.html", {
        "form": form,
        "image_formset": image_formset,
        "elon": elon,
    })




@login_required
@user_passes_test(is_admin)
def elon_delete_view(request, pk):
    elon = get_object_or_404(Elon, pk=pk)
    elon.delete()
    messages.success(request, _("E’lon o‘chirildi"))
    return redirect("elon_list")

# =====================================================
# DASHBOARD - FACULTY
# =====================================================

@login_required
@user_passes_test(is_admin)
def faculty_list_view(request):
    faculties = Faculty.objects.order_by("-id")
    return render(request, "_dashboard/faculty/faculty.html", {"faculties": faculties})

@login_required
@user_passes_test(is_admin)
def faculty_create_view(request):
    if request.method == "POST":
        form = FacultyForm(request.POST, request.FILES)
        formset = FacultyStaffFormSet(request.POST, request.FILES, prefix="staffs")
        if form.is_valid() and formset.is_valid():
            faculty = form.save()
            formset.instance = faculty
            formset.save()
            messages.success(request, _("Fakultet saqlandi"))
            return redirect("main:faculty_list_dashboard")
    else:
        form = FacultyForm()
        formset = FacultyStaffFormSet(prefix="staffs")
    return render(request, "_dashboard/faculty/faculty_create.html", {"form": form, "formset": formset})

@login_required
@user_passes_test(is_admin)
def faculty_edit_view(request, pk):
    faculty = get_object_or_404(Faculty, pk=pk)
    if request.method == "POST":
        form = FacultyForm(request.POST, request.FILES, instance=faculty)
        formset = FacultyStaffFormSet(request.POST, request.FILES, instance=faculty, prefix="staffs")
        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()
            messages.success(request, _("Fakultet yangilandi"))
            return redirect("main:faculty_list_dashboard")
    else:
        form = FacultyForm(instance=faculty)
        formset = FacultyStaffFormSet(instance=faculty, prefix="staffs")
    return render(request, "_dashboard/faculty/faculty_edit.html", {"form": form, "formset": formset, "faculty": faculty})

@login_required
@user_passes_test(is_admin)
def faculty_delete_view(request, pk):
    faculty = get_object_or_404(Faculty, pk=pk)
    faculty.delete()
    messages.success(request, _("Fakultet o'chirildi"))
    return redirect("main:faculty_list_dashboard")


# =====================================================
# DASHBOARD - DEPARTMENT
# =====================================================

@login_required
@user_passes_test(is_admin)
def department_list_view(request):
    departments = Department.objects.order_by("-id")
    return render(request, "_dashboard/department/department.html", {"departments": departments})

@login_required
@user_passes_test(is_admin)
def department_create_view(request):
    if request.method == "POST":
        form = DepartmentForm(request.POST, request.FILES)
        formset = DepartmentStaffFormSet(request.POST, request.FILES, prefix="staffs")
        if form.is_valid() and formset.is_valid():
            dept = form.save()
            formset.instance = dept
            formset.save()
            messages.success(request, _("Kafedra saqlandi"))
            return redirect("main:department_list_dashboard")
    else:
        form = DepartmentForm()
        formset = DepartmentStaffFormSet(prefix="staffs")
    return render(request, "_dashboard/department/department_create.html", {"form": form, "formset": formset})

@login_required
@user_passes_test(is_admin)
def department_edit_view(request, pk):
    dept = get_object_or_404(Department, pk=pk)
    if request.method == "POST":
        form = DepartmentForm(request.POST, request.FILES, instance=dept)
        formset = DepartmentStaffFormSet(request.POST, request.FILES, instance=dept, prefix="staffs")
        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()
            messages.success(request, _("Kafedra yangilandi"))
            return redirect("main:department_list_dashboard")
    else:
        form = DepartmentForm(instance=dept)
        formset = DepartmentStaffFormSet(instance=dept, prefix="staffs")
    return render(request, "_dashboard/department/department_edit.html", {"form": form, "formset": formset, "department": dept})

@login_required
@user_passes_test(is_admin)
def department_delete_view(request, pk):
    dept = get_object_or_404(Department, pk=pk)
    dept.delete()
    messages.success(request, _("Kafedra o'chirildi"))
    return redirect("main:department_list_dashboard")


# =====================================================
# DASHBOARD - RESEARCH CENTER
# =====================================================

@login_required
@user_passes_test(is_admin)
def center_list_view(request):
    centers = ResearchCenter.objects.order_by("-id")
    return render(request, "_dashboard/center/center.html", {"centers": centers})

@login_required
@user_passes_test(is_admin)
def center_create_view(request):
    if request.method == "POST":
        form = ResearchCenterForm(request.POST, request.FILES)
        formset = ResearchCenterStaffFormSet(request.POST, request.FILES, prefix="staffs")
        if form.is_valid() and formset.is_valid():
            center = form.save()
            formset.instance = center
            formset.save()
            messages.success(request, _("Bo'lim saqlandi"))
            return redirect("main:center_list_dashboard")
    else:
        form = ResearchCenterForm()
        formset = ResearchCenterStaffFormSet(prefix="staffs")
    return render(request, "_dashboard/center/center_create.html", {"form": form, "formset": formset})

@login_required
@user_passes_test(is_admin)
def center_edit_view(request, pk):
    center = get_object_or_404(ResearchCenter, pk=pk)
    if request.method == "POST":
        form = ResearchCenterForm(request.POST, request.FILES, instance=center)
        formset = ResearchCenterStaffFormSet(request.POST, request.FILES, instance=center, prefix="staffs")
        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()
            messages.success(request, _("Bo'lim yangilandi"))
            return redirect("main:center_list_dashboard")
    else:
        form = ResearchCenterForm(instance=center)
        formset = ResearchCenterStaffFormSet(instance=center, prefix="staffs")
    return render(request, "_dashboard/center/center_edit.html", {"form": form, "formset": formset, "center": center})

@login_required
@user_passes_test(is_admin)
def center_delete_view(request, pk):
    center = get_object_or_404(ResearchCenter, pk=pk)
    center.delete()
    messages.success(request, _("Bo'lim o'chirildi"))
    return redirect("main:center_list_dashboard")


# =====================================================
# DASHBOARD - RECTORATE
# =====================================================

@login_required
@user_passes_test(is_admin)
def rector_list_view_dashboard(request):
    rectors = Rector.objects.order_by("-id")
    return render(request, "_dashboard/rectorate/rectorate.html", {"rectors": rectors})

@login_required
@user_passes_test(is_admin)
def rector_create_view(request):
    if request.method == "POST":
        form = RectorForm(request.POST, request.FILES)
        edu_formset = RectorEducationFormSet(request.POST, request.FILES, prefix="edu")
        exp_formset = RectorExperienceFormSet(request.POST, request.FILES, prefix="exp")
        social_formset = RectorSocialLinkFormSet(request.POST, request.FILES, prefix="social")
        if form.is_valid() and edu_formset.is_valid() and exp_formset.is_valid() and social_formset.is_valid():
            rector = form.save()
            edu_formset.instance = rector
            edu_formset.save()
            exp_formset.instance = rector
            exp_formset.save()
            social_formset.instance = rector
            social_formset.save()
            messages.success(request, _("Rahbar saqlandi"))
            return redirect("main:rector_list_dashboard")
    else:
        form = RectorForm()
        edu_formset = RectorEducationFormSet(prefix="edu")
        exp_formset = RectorExperienceFormSet(prefix="exp")
        social_formset = RectorSocialLinkFormSet(prefix="social")
    return render(request, "_dashboard/rectorate/rector_create.html", {
        "form": form, 
        "edu_formset": edu_formset, 
        "exp_formset": exp_formset, 
        "social_formset": social_formset
    })

@login_required
@user_passes_test(is_admin)
def rector_edit_view_dashboard(request, pk):
    rector = get_object_or_404(Rector, pk=pk)
    if request.method == "POST":
        form = RectorForm(request.POST, request.FILES, instance=rector)
        edu_formset = RectorEducationFormSet(request.POST, request.FILES, instance=rector, prefix="edu")
        exp_formset = RectorExperienceFormSet(request.POST, request.FILES, instance=rector, prefix="exp")
        social_formset = RectorSocialLinkFormSet(request.POST, request.FILES, instance=rector, prefix="social")
        if form.is_valid() and edu_formset.is_valid() and exp_formset.is_valid() and social_formset.is_valid():
            form.save()
            edu_formset.save()
            exp_formset.save()
            social_formset.save()
            messages.success(request, _("Rahbar yangilandi"))
            return redirect("main:rector_list_dashboard")
    else:
        form = RectorForm(instance=rector)
        edu_formset = RectorEducationFormSet(instance=rector, prefix="edu")
        exp_formset = RectorExperienceFormSet(instance=rector, prefix="exp")
        social_formset = RectorSocialLinkFormSet(instance=rector, prefix="social")
    return render(request, "_dashboard/rectorate/rector_edit.html", {
        "form": form, 
        "edu_formset": edu_formset, 
        "exp_formset": exp_formset, 
        "social_formset": social_formset,
        "rector": rector
    })

@login_required
@user_passes_test(is_admin)
def rector_delete_view_dashboard(request, pk):
    rector = get_object_or_404(Rector, pk=pk)
    rector.delete()
    messages.success(request, _("Rahbar o'chirildi"))
    return redirect("main:rector_list_dashboard")
# =====================================================
# DASHBOARD - EDUCATION (TALIM)
# =====================================================

@login_required
@user_passes_test(is_admin)
def bachelor_list_dashboard(request):
    categories = BachelorCategory.objects.all().order_by("order")
    return render(request, "_dashboard/talim/bachelor_list.html", {"categories": categories})

@login_required
@user_passes_test(is_admin)
def bachelor_create_dashboard(request):
    if request.method == "POST":
        form = BachelorCategoryForm(request.POST)
        formset = BachelorProgramFormSet(request.POST, prefix="programs")
        if form.is_valid() and formset.is_valid():
            category = form.save()
            formset.instance = category
            formset.save()
            messages.success(request, _("Bakalavr yo'nalishi saqlandi"))
            return redirect("main:bachelor_list_dashboard")
    else:
        form = BachelorCategoryForm()
        formset = BachelorProgramFormSet(prefix="programs")
    return render(request, "_dashboard/talim/bachelor_create.html", {"form": form, "formset": formset})

@login_required
@user_passes_test(is_admin)
def bachelor_edit_dashboard(request, pk):
    category = get_object_or_404(BachelorCategory, pk=pk)
    if request.method == "POST":
        form = BachelorCategoryForm(request.POST, instance=category)
        formset = BachelorProgramFormSet(request.POST, instance=category, prefix="programs")
        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()
            messages.success(request, _("Yangilandi"))
            return redirect("main:bachelor_list_dashboard")
    else:
        form = BachelorCategoryForm(instance=category)
        formset = BachelorProgramFormSet(instance=category, prefix="programs")
    return render(request, "_dashboard/talim/bachelor_edit.html", {"form": form, "formset": formset, "category": category})

@login_required
@user_passes_test(is_admin)
def bachelor_delete_dashboard(request, pk):
    category = get_object_or_404(BachelorCategory, pk=pk)
    category.delete()
    messages.success(request, _("O'chirildi"))
    return redirect("main:bachelor_list_dashboard")


@login_required
@user_passes_test(is_admin)
def master_list_dashboard(request):
    categories = MasterCategory.objects.all().order_by("order")
    return render(request, "_dashboard/talim/master_list.html", {"categories": categories})

@login_required
@user_passes_test(is_admin)
def master_create_dashboard(request):
    if request.method == "POST":
        form = MasterCategoryForm(request.POST)
        formset = MasterProgramFormSet(request.POST, prefix="programs")
        if form.is_valid() and formset.is_valid():
            category = form.save()
            formset.instance = category
            formset.save()
            messages.success(request, "Magistratura yo'nalishi saqlandi")
            return redirect("main:master_list_dashboard")
    else:
        form = MasterCategoryForm()
        formset = MasterProgramFormSet(prefix="programs")
    return render(request, "_dashboard/talim/master_create.html", {"form": form, "formset": formset})

@login_required
@user_passes_test(is_admin)
def master_edit_dashboard(request, pk):
    category = get_object_or_404(MasterCategory, pk=pk)
    if request.method == "POST":
        form = MasterCategoryForm(request.POST, instance=category)
        formset = MasterProgramFormSet(request.POST, instance=category, prefix="programs")
        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()
            messages.success(request, "Yangilandi")
            return redirect("main:master_list_dashboard")
    else:
        form = MasterCategoryForm(instance=category)
        formset = MasterProgramFormSet(instance=category, prefix="programs")
    return render(request, "_dashboard/talim/master_edit.html", {"form": form, "formset": formset, "category": category})


@login_required
@user_passes_test(is_admin)
def edu_doc_list_dashboard(request):
    docs = EducationalDocument.objects.all().order_by("order")
    return render(request, "_dashboard/talim/doc_list.html", {"docs": docs})

@login_required
@user_passes_test(is_admin)
def edu_doc_create_dashboard(request):
    if request.method == "POST":
        form = EducationalDocumentForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            messages.success(request, "Hujjat qo'shildi")
            return redirect("main:edu_doc_list_dashboard")
    else:
        form = EducationalDocumentForm()
    return render(request, "_dashboard/talim/doc_create.html", {"form": form})

@login_required
@user_passes_test(is_admin)
def edu_doc_edit_dashboard(request, pk):
    doc = get_object_or_404(EducationalDocument, pk=pk)
    if request.method == "POST":
        form = EducationalDocumentForm(request.POST, request.FILES, instance=doc)
        if form.is_valid():
            form.save()
            messages.success(request, "Yangilandi")
            return redirect("main:edu_doc_list_dashboard")
    else:
        form = EducationalDocumentForm(instance=doc)
    return render(request, "_dashboard/talim/doc_edit.html", {"form": form, "doc": doc})

@login_required
@user_passes_test(is_admin)
def edu_doc_delete_dashboard(request, pk):
    doc = get_object_or_404(EducationalDocument, pk=pk)
    doc.delete()
    messages.success(request, "Hujjat o'chirildi")
    return redirect("main:edu_doc_list_dashboard")


# =====================================================
# DASHBOARD - PROJECTS (LOYIHA)
# =====================================================

@login_required
@user_passes_test(is_admin)
def project_list_dashboard(request):
    projects = Project.objects.all().order_by("-id")
    return render(request, "_dashboard/loyiha/project_list.html", {"projects": projects})

@login_required
@user_passes_test(is_admin)
def project_create_dashboard(request):
    if request.method == "POST":
        form = ProjectForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Loyiha saqlandi")
            return redirect("main:project_list_dashboard")
    else:
        form = ProjectForm()
    return render(request, "_dashboard/loyiha/project_create.html", {"form": form})

@login_required
@user_passes_test(is_admin)
def project_edit_dashboard(request, pk):
    project = get_object_or_404(Project, pk=pk)
    if request.method == "POST":
        form = ProjectForm(request.POST, instance=project)
        if form.is_valid():
            form.save()
            messages.success(request, "Yangilandi")
            return redirect("main:project_list_dashboard")
    else:
        form = ProjectForm(instance=project)
    return render(request, "_dashboard/loyiha/project_edit.html", {"form": form, "project": project})

@login_required
@user_passes_test(is_admin)
def project_delete_dashboard(request, pk):
    project = get_object_or_404(Project, pk=pk)
    project.delete()
    messages.success(request, "Loyiha o'chirildi")
    return redirect("main:project_list_dashboard")


# =====================================================
# DASHBOARD - INTERNATIONAL (XALQARO)
# =====================================================

@login_required
@user_passes_test(is_admin)
def partner_country_list_dashboard(request):
    countries = PartnerCountry.objects.all().order_by("order")
    return render(request, "_dashboard/xalqaro/country_list.html", {"countries": countries})

@login_required
@user_passes_test(is_admin)
def partner_country_create_dashboard(request):
    if request.method == "POST":
        form = PartnerCountryForm(request.POST, request.FILES)
        formset = PartnerUniversityFormSet(request.POST, prefix="universities")
        if form.is_valid() and formset.is_valid():
            country = form.save()
            formset.instance = country
            formset.save()
            messages.success(request, "Hamkor davlat saqlandi")
            return redirect("main:partner_country_list_dashboard")
    else:
        form = PartnerCountryForm()
        formset = PartnerUniversityFormSet(prefix="universities")
    return render(request, "_dashboard/xalqaro/country_create.html", {"form": form, "formset": formset})

@login_required
@user_passes_test(is_admin)
def partner_country_edit_dashboard(request, pk):
    country = get_object_or_404(PartnerCountry, pk=pk)
    if request.method == "POST":
        form = PartnerCountryForm(request.POST, request.FILES, instance=country)
        formset = PartnerUniversityFormSet(request.POST, instance=country, prefix="universities")
        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()
            messages.success(request, "Yangilandi")
            return redirect("main:partner_country_list_dashboard")
    else:
        form = PartnerCountryForm(instance=country)
        formset = PartnerUniversityFormSet(instance=country, prefix="universities")
    return render(request, "_dashboard/xalqaro/country_edit.html", {"form": form, "formset": formset, "country": country})

@login_required
@user_passes_test(is_admin)
def partner_country_delete_dashboard(request, pk):
    country = get_object_or_404(PartnerCountry, pk=pk)
    country.delete()
    messages.success(request, "O'chirildi")
    return redirect("main:partner_country_list_dashboard")


@login_required
@user_passes_test(is_admin)
def cooperation_program_list_dashboard(request):
    programs = CooperationProgram.objects.all().order_by("order")
    return render(request, "_dashboard/xalqaro/program_list.html", {"programs": programs})

@login_required
@user_passes_test(is_admin)
def cooperation_program_create_dashboard(request):
    if request.method == "POST":
        form = CooperationProgramForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Dastur saqlandi")
            return redirect("main:cooperation_program_list_dashboard")
    else:
        form = CooperationProgramForm()
    return render(request, "_dashboard/xalqaro/program_create.html", {"form": form})

@login_required
@user_passes_test(is_admin)
def cooperation_program_edit_dashboard(request, pk):
    program = get_object_or_404(CooperationProgram, pk=pk)
    if request.method == "POST":
        form = CooperationProgramForm(request.POST, instance=program)
        if form.is_valid():
            form.save()
            messages.success(request, "Yangilandi")
            return redirect("main:cooperation_program_list_dashboard")
    else:
        form = CooperationProgramForm(instance=program)
    return render(request, "_dashboard/xalqaro/program_edit.html", {"form": form, "program": program})

@login_required
@user_passes_test(is_admin)
def cooperation_program_delete_dashboard(request, pk):
    program = get_object_or_404(CooperationProgram, pk=pk)
    program.delete()
    messages.success(request, "O'chirildi")
    return redirect("main:cooperation_program_list_dashboard")


# =====================================================
# DASHBOARD - SCIENCE (ILMIY FAOLIYAT)
# =====================================================

@login_required
@user_passes_test(is_admin)
def scientific_stat_list_dashboard(request):
    stats = ScientificStat.objects.all().order_by("order")
    return render(request, "_dashboard/faoliyat/stat_list.html", {"stats": stats})

@login_required
@user_passes_test(is_admin)
def scientific_stat_create_dashboard(request):
    if request.method == "POST":
        form = ScientificStatForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Statistika saqlandi")
            return redirect("main:scientific_stat_list_dashboard")
    else:
        form = ScientificStatForm()
    return render(request, "_dashboard/faoliyat/stat_create.html", {"form": form})

@login_required
@user_passes_test(is_admin)
def scientific_stat_edit_dashboard(request, pk):
    stat = get_object_or_404(ScientificStat, pk=pk)
    if request.method == "POST":
        form = ScientificStatForm(request.POST, instance=stat)
        if form.is_valid():
            form.save()
            messages.success(request, "Yangilandi")
            return redirect("main:scientific_stat_list_dashboard")
    else:
        form = ScientificStatForm(instance=stat)
    return render(request, "_dashboard/faoliyat/stat_edit.html", {"form": form, "stat": stat})

@login_required
@user_passes_test(is_admin)
def scientific_stat_delete_dashboard(request, pk):
    stat = get_object_or_404(ScientificStat, pk=pk)
    stat.delete()
    messages.success(request, "O'chirildi")
    return redirect("main:scientific_stat_list_dashboard")


@login_required
@user_passes_test(is_admin)
def publication_stat_list_dashboard(request):
    pub_stats = PublicationStat.objects.all().order_by("-year")
    return render(request, "_dashboard/faoliyat/pub_list.html", {"pub_stats": pub_stats})

@login_required
@user_passes_test(is_admin)
def publication_stat_create_dashboard(request):
    if request.method == "POST":
        form = PublicationStatForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Nashr statistikasi qo'shildi")
            return redirect("main:publication_stat_list_dashboard")
    else:
        form = PublicationStatForm()
    return render(request, "_dashboard/faoliyat/pub_create.html", {"form": form})

@login_required
@user_passes_test(is_admin)
def publication_stat_edit_dashboard(request, pk):
    pub = get_object_or_404(PublicationStat, pk=pk)
    if request.method == "POST":
        form = PublicationStatForm(request.POST, instance=pub)
        if form.is_valid():
            form.save()
            messages.success(request, "Nashr statistikasi yangilandi")
            return redirect("main:publication_stat_list_dashboard")
    else:
        form = PublicationStatForm(instance=pub)
    return render(request, "_dashboard/faoliyat/pub_edit.html", {"form": form, "pub": pub})

@login_required
@user_passes_test(is_admin)
def publication_stat_delete_dashboard(request, pk):
    pub = get_object_or_404(PublicationStat, pk=pk)
    pub.delete()
    messages.success(request, "O'chirildi")
    return redirect("main:publication_stat_list_dashboard")


# =====================================================
# DASHBOARD - ALOQA (CONTACT)
# =====================================================

@login_required
@user_passes_test(is_admin)
def contact_list_dashboard(request):
    links = CallLink.objects.first()
    categories = CallUserCategory.objects.all()
    return render(request, "_dashboard/aloqa/contact.html", {"links": links, "categories": categories})

@login_required
@user_passes_test(is_admin)
def contact_links_edit_dashboard(request):
    links = CallLink.objects.first()
    if request.method == "POST":
        form = CallLinkForm(request.POST, instance=links)
        if form.is_valid():
            form.save()
            messages.success(request, "Ijtimoiy tarmoqlar yangilandi")
            return redirect("main:contact_list_dashboard")
    else:
        form = CallLinkForm(instance=links)
    return render(request, "_dashboard/aloqa/links_edit.html", {"form": form})

@login_required
@user_passes_test(is_admin)
def contact_category_create_dashboard(request):
    if request.method == "POST":
        form = CallUserCategoryForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Bog'lanish bo'limi qo'shildi")
            return redirect("main:contact_list_dashboard")
    else:
        form = CallUserCategoryForm()
    return render(request, "_dashboard/aloqa/category_create.html", {"form": form})

@login_required
@user_passes_test(is_admin)
def contact_category_edit_dashboard(request, pk):
    cat = get_object_or_404(CallUserCategory, pk=pk)
    if request.method == "POST":
        form = CallUserCategoryForm(request.POST, instance=cat)
        if form.is_valid():
            form.save()
            messages.success(request, "Yangilandi")
            return redirect("main:contact_list_dashboard")
    else:
        form = CallUserCategoryForm(instance=cat)
    return render(request, "_dashboard/aloqa/category_edit.html", {"form": form, "category": cat})

@login_required
@user_passes_test(is_admin)
def contact_category_delete_dashboard(request, pk):
    cat = get_object_or_404(CallUserCategory, pk=pk)
    cat.delete()
    messages.success(request, "O'chirildi")
    return redirect("main:contact_list_dashboard")


# =====================================================
# DASHBOARD - MEDIA (GALLERY)
# =====================================================

@login_required
@user_passes_test(is_admin)
def gallery_list_dashboard(request):
    images = galareyaIMG.objects.all().order_by("-id")
    return render(request, "_dashboard/media/gallery.html", {"images": images})

@login_required
@user_passes_test(is_admin)
def gallery_create_dashboard(request):
    if request.method == "POST":
        form = GalleryForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            messages.success(request, "Rasm galereyaga qo'shildi")
            return redirect("main:gallery_list_dashboard")
    else:
        form = GalleryForm()
    return render(request, "_dashboard/media/gallery_create.html", {"form": form})

@login_required
@user_passes_test(is_admin)
def gallery_delete_dashboard(request, pk):
    img = get_object_or_404(galareyaIMG, pk=pk)
    img.delete()
    messages.success(request, "Rasm o'chirildi")
    return redirect("main:gallery_list_dashboard")
