"""JM3 task engine.

Tasks are generated from a SCOPED set of assets — the ones a given user is
authorised to see — so a new user with no trees gets no tasks (an empty,
'add your first tree' home), never a list of someone else's work.

Tasks are created idempotently: never a second pending task of the same type
for the same asset.
"""

from datetime import timedelta

from django.db.models import Max
from django.utils import timezone

from .models import Task

CHECK_AFTER_DAYS = 14
MAX_NEW_PER_TYPE = 8


def _has_pending(task_type, **kwargs):
    return Task.objects.filter(task_type=task_type, status="pending", **kwargs).exists()


def generate_tasks(assets):
    """Create pending tasks for the given (already-scoped) asset queryset."""
    cutoff = timezone.now() - timedelta(days=CHECK_AFTER_DAYS)

    trees = (assets.filter(asset_type="tree", health_status__in=["alive", "stressed"])
             .annotate(last_seen=Max("activities__created_at")))
    created = 0
    for tree in trees:
        if created >= MAX_NEW_PER_TYPE:
            break
        if tree.last_seen is not None and tree.last_seen >= cutoff:
            continue
        if _has_pending("check_tree", asset=tree):
            continue
        Task.objects.create(task_type="check_tree", title=f"Check {tree.display_name}",
                            organization=tree.organization, asset=tree)
        created += 1

    created = 0
    for tree in assets.filter(asset_type="tree", verification_status="pending")[:50]:
        if created >= MAX_NEW_PER_TYPE:
            break
        if _has_pending("review_photo", asset=tree):
            continue
        Task.objects.create(task_type="review_photo", title=f"Review photo for {tree.display_name}",
                            organization=tree.organization, asset=tree)
        created += 1

    created = 0
    for nursery in assets.filter(asset_type="nursery"):
        if created >= MAX_NEW_PER_TYPE:
            break
        if _has_pending("water_nursery", asset=nursery):
            continue
        Task.objects.create(task_type="water_nursery", title=f"Water {nursery.display_name}",
                            organization=nursery.organization, asset=nursery)
        created += 1


def pending_tasks(assets):
    return Task.objects.filter(status="pending", asset__in=assets)


def task_summary(assets):
    qs = pending_tasks(assets)
    return {
        "check_tree": qs.filter(task_type="check_tree").count(),
        "review_photo": qs.filter(task_type="review_photo").count(),
        "water_nursery": qs.filter(task_type="water_nursery").count(),
        "total": qs.count(),
    }
