"""Admin views for ScheduledCampaign entity."""
from datetime import datetime
from typing import Any

from django import forms
from django.conf import settings
from django.contrib import admin

from scheduledcampaigns.models import ScheduledCampaign
from scheduledcampaigns.utils import FullHourValidationError, TimeSelectorSplitDateTime


class ScheduledCampaignAdminForm(forms.ModelForm):
    """ScheduledCampaign form for django admin."""

    end = forms.DateTimeField(
        widget=forms.TextInput(), disabled=True, help_text="End date is set automatically", required=False
    )

    def clean(self) -> dict[str, Any]:
        """Set end field automatically based on start field."""
        cleaned_data = super().clean()
        if start := cleaned_data.get("start"):
            # schedule's end needs to be set automatically based on the start to match schedule window size
            cleaned_data["end"] = start + settings.SCHEDULE_TIME_WINDOW

        return cleaned_data

    def clean_start(self) -> datetime:
        """Validate start field."""
        start = self.cleaned_data["start"]
        if (start.minute or start.second) != 0:
            raise FullHourValidationError
        return start

    class Meta:
        """ScheduledCampaignAdminForm meta class."""

        model = ScheduledCampaign
        fields = ["campaign", "start", "end"]
        widgets = {
            "start": TimeSelectorSplitDateTime
        }
        field_classes={
            "start": forms.SplitDateTimeField
        }


@admin.register(ScheduledCampaign)
class ScheduledCampaignAdmin(admin.ModelAdmin):
    """ScheduledCampaign admin model."""

    readonly_fields = ("created_at", "updated_at")

    form = ScheduledCampaignAdminForm
