from django import forms
from django.contrib.auth import get_user_model

from apps.rims.finance.models import Budget
from apps.rims.grants.models import Award
from apps.rims.projects.models import Milestone, Project

_PROJECT_SELECT_CLASS = (
    "w-full rounded-lg border border-ruforum-border bg-white px-3 py-2 text-sm text-ruforum-text"
)


class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = ["award", "finance_budget", "title", "lead", "summary", "start_date", "end_date", "status"]
        widgets = {
            "award": forms.Select(attrs={"class": _PROJECT_SELECT_CLASS}),
            "finance_budget": forms.Select(attrs={"class": _PROJECT_SELECT_CLASS}),
            "lead": forms.Select(attrs={"class": _PROJECT_SELECT_CLASS}),
            "summary": forms.Textarea(attrs={"rows": 4}),
            "start_date": forms.DateInput(attrs={"type": "date"}),
            "end_date": forms.DateInput(attrs={"type": "date"}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Only show awards without a project; when editing include the current award
        qs = Award.objects.filter(project__isnull=True).select_related("application__institution")
        instance = kwargs.get("instance")
        if instance and instance.pk:
            qs = qs | Award.objects.filter(pk=instance.award_id)
        self.fields["award"].queryset = qs.distinct()
        self.fields["award"].label = "Grant award"
        self.fields["finance_budget"].required = False
        self.fields["lead"].required = False
        self.fields["lead"].label = "PI / Lead"
        User = get_user_model()
        self.fields["lead"].queryset = User.objects.filter(is_active=True).order_by("first_name", "last_name", "email")
        aid = None
        if self.data.get("award"):
            try:
                aid = int(self.data["award"])
            except (TypeError, ValueError):
                pass
        elif instance and instance.pk and instance.award_id:
            aid = instance.award_id
        if aid:
            self.fields["finance_budget"].queryset = Budget.objects.filter(award_id=aid).order_by("-created_at")
        else:
            self.fields["finance_budget"].queryset = Budget.objects.none()


class MilestoneForm(forms.ModelForm):
    class Meta:
        model = Milestone
        fields = ["name", "due_date", "completion_percent", "report_due"]
        widgets = {
            "due_date": forms.DateInput(attrs={"type": "date", "class": _PROJECT_SELECT_CLASS}),
            "completion_percent": forms.NumberInput(
                attrs={"class": _PROJECT_SELECT_CLASS, "min": 0, "max": 100, "step": 1}
            ),
            "name": forms.TextInput(attrs={"class": _PROJECT_SELECT_CLASS}),
            "report_due": forms.CheckboxInput(
                attrs={
                    "class": (
                        "h-4 w-4 rounded border-ruforum-border text-ruforum-primary focus:outline-none "
                        "focus:ring-2 focus:ring-ruforum-primary focus:ring-offset-0"
                    )
                }
            ),
        }


class MilestoneSubmitForm(forms.Form):
    report_summary = forms.CharField(
        required=True,
        widget=forms.Textarea(
            attrs={
                "rows": 4,
                "class": (
                    "w-full rounded-lg border border-ruforum-border bg-white px-3 py-2 text-sm text-ruforum-text"
                ),
            }
        ),
    )
    completion_percent = forms.IntegerField(min_value=0, max_value=100, required=True)
    deliverable_title = forms.CharField(required=False, max_length=255)
    deliverable_notes = forms.CharField(
        required=False,
        widget=forms.Textarea(
            attrs={
                "rows": 2,
                "class": (
                    "w-full rounded-lg border border-ruforum-border bg-white px-3 py-2 text-sm text-ruforum-text"
                ),
            }
        ),
    )
    deliverable_file = forms.FileField(required=False)


class MilestoneReviewForm(forms.Form):
    decision = forms.ChoiceField(
        choices=(
            (Milestone.Status.ACCEPTED, "Accept"),
            (Milestone.Status.REVISION_REQUIRED, "Request revision"),
        )
    )
    comment = forms.CharField(
        required=False,
        widget=forms.Textarea(
            attrs={
                "rows": 3,
                "class": (
                    "w-full rounded-lg border border-ruforum-border bg-white px-3 py-2 text-sm text-ruforum-text"
                ),
            }
        ),
    )
