from datetime import datetime

from django.contrib import admin, messages
from django.shortcuts import redirect, render
from django.urls import path, reverse
from orders.models import Order
from orders.services import OrderService


@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = (
        "digistore_order_id",
        "shopify_order_id",
        "status",
        "created_at",
        "updated_at",
    )
    search_fields = ("shopify_order_id", "digistore_order_id")
    readonly_fields = ("created_at", "updated_at")

    def get_urls(self):
        urls = super().get_urls()
        custom = [
            path(
                "sync-by-date/",
                self.admin_site.admin_view(self.sync_by_date_view),
                name="orders_order_sync_by_date",
            )
        ]
        return custom + urls

    def changelist_view(self, request, extra_context=None):
        extra_context = extra_context or {}
        extra_context["sync_by_date_url"] = reverse("admin:orders_order_sync_by_date")
        return super().changelist_view(request, extra_context=extra_context)

    def sync_by_date_view(self, request):
        context = {
            **self.admin_site.each_context(request),
            "opts": self.model._meta,
            "sync_by_date_url": reverse("admin:orders_order_sync_by_date"),
        }

        if request.method == "POST":
            date_str = (request.POST.get("date") or "").strip()
            if not date_str:
                messages.error(request, "Please provide a date in YYYY-MM-DD format.")
                return render(request, "admin/orders/sync_by_date.html", context)

            try:
                datetime.strptime(date_str, "%Y-%m-%d")
            except ValueError:
                messages.error(request, "Invalid date format. Use YYYY-MM-DD.")
                return render(request, "admin/orders/sync_by_date.html", context)

            from_time = f"{date_str} 00:00:00"
            to_time = f"{date_str} 23:59:59"

            try:
                result = OrderService.sync_digistore_orders_to_shopify(
                    from_time,
                    to_time,
                    dry_run=False,
                )
            except Exception as exc:
                messages.error(request, f"Sync failed: {exc}")
                return redirect("admin:orders_order_changelist")

            created = result.get("shopify_orders_created", 0)
            skipped = result.get("skipped_already_in_shopify", 0)
            status_skipped = result.get("skipped_billing_status", 0)
            errors = len(result.get("errors") or [])
            messages.success(
                request,
                (
                    f"Sync complete for {date_str}. "
                    f"Created: {created}, "
                    f"Skipped (already synced): {skipped}, "
                    f"Skipped (status): {status_skipped}, "
                    f"Errors: {errors}."
                ),
            )
            return redirect("admin:orders_order_changelist")

        return render(request, "admin/orders/sync_by_date.html", context)
