from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.shortcuts import redirect, render
from django.utils.dateparse import parse_date
from django.views import View
from django.views.generic import ListView

from .forms import CompanySettingsForm
from .models import ActivityLog, CompanySettings


def home(request):
    return render(request, "core/home.html")


class CompanySettingsView(PermissionRequiredMixin, View):
    permission_required = "core.change_companysettings"
    template_name = "core/company_settings.html"

    def get(self, request):
        return render(request, self.template_name, {"form": CompanySettingsForm(instance=CompanySettings.load())})

    def post(self, request):
        instance = CompanySettings.load()
        form = CompanySettingsForm(request.POST, instance=instance)
        if form.is_valid():
            changed = {name: {"من": str(form.initial.get(name, "")), "إلى": str(form.cleaned_data[name])}
                       for name in form.changed_data}
            form.save()
            if changed:
                ActivityLog.record(ActivityLog.SETTINGS, user=request.user, obj=instance, details={"changes": changed}, request=request)
            messages.success(request, "تم حفظ إعدادات الشركة.")
            return redirect("company_settings")
        messages.error(request, "تعذّر الحفظ، راجع الحقول المعلَّمة.")
        return render(request, self.template_name, {"form": form})


class ActivityLogListView(PermissionRequiredMixin, ListView):
    permission_required = "core.view_activitylog"
    model = ActivityLog
    template_name = "core/activity_log.html"
    paginate_by = 50

    def get_queryset(self):
        qs = ActivityLog.objects.all()
        p = self.request.GET
        if p.get("action"):
            qs = qs.filter(action=p["action"])
        if p.get("user"):
            qs = qs.filter(username__icontains=p["user"])
        date_from, date_to = parse_date(p.get("from", "") or ""), parse_date(p.get("to", "") or "")
        if date_from:
            qs = qs.filter(created_at__date__gte=date_from)
        if date_to:
            qs = qs.filter(created_at__date__lte=date_to)
        return qs

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx["actions"] = ActivityLog.ACTION_CHOICES
        params = self.request.GET.copy()
        params.pop("page", None)
        ctx["querystring"] = params.urlencode()
        return ctx


def permission_denied(request, exception=None):
    return render(request, "403.html", status=403)
