"""Time Tracking domain models.

Model inventory
---------------
TimeEntry  — core entity: tenant-scoped time log on project/task

Design decisions
----------------
* TimeEntry has a UUID public_id for external references.
* project is required; task is optional.
* hours uses Decimal(5,2) — max 999.99h, but validated at service layer to ≤ 24/day.
* is_approved tracks approval state; approved_by/approved_at store who approved.
* Approved entries are protected from edits at the service layer.
"""

from __future__ import annotations

from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _

from simorgh.core.models import (
    TenantScopedModel,
    TimeStampedModel,
    UUIDModel,
)


class TimeEntry(UUIDModel, TenantScopedModel, TimeStampedModel):
    """A single time log entry for a user on a project/task."""

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="time_entries",
        verbose_name=_("user"),
    )
    project = models.ForeignKey(
        "projects.Project",
        on_delete=models.CASCADE,
        related_name="time_entries",
        verbose_name=_("project"),
    )
    task = models.ForeignKey(
        "tasks.Task",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="time_entries",
        verbose_name=_("task"),
    )
    date        = models.DateField(_("date"))
    hours       = models.DecimalField(_("hours"), max_digits=5, decimal_places=2)
    description = models.TextField(_("description"), blank=True, default="")
    is_billable = models.BooleanField(_("billable"), default=True)
    is_approved = models.BooleanField(_("approved"), default=False)
    approved_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="approved_time_entries",
        verbose_name=_("approved by"),
    )
    approved_at = models.DateTimeField(_("approved at"), null=True, blank=True)

    class Meta:
        verbose_name        = _("time entry")
        verbose_name_plural = _("time entries")
        indexes = [
            models.Index(fields=["tenant", "user", "date"],    name="time_entry_tenant_user_date"),
            models.Index(fields=["tenant", "project", "date"], name="time_entry_tenant_project_date"),
        ]
        ordering = ["-date", "-created_at"]

    def __str__(self) -> str:
        return f"{self.user_id} — {self.hours}h on {self.date}"
