"""WS2 defect #33 — MEL notifications raised in tracking code carry action_url.

- smehub-stalled  → /mel/events/smehub/stalled/
- new-tracking-record → /mel/events/smehub/<pk>/
"""
from __future__ import annotations

import pytest
from django.contrib.auth import get_user_model
from django.urls import reverse

from apps.core.notifications.models import Notification
from apps.core.permissions.roles import UserRole
from apps.mel.tracking.models import SMEHubTrackingRecord
from apps.mel.tracking.services import notify_newly_stalled
from apps.mel.tracking.smehub_receivers import _notify_mel_officers_new_tracking_record
from apps.smehub.onboarding.models import Business, BusinessStage, EntrepreneurProfile

User = get_user_model()
pytestmark = pytest.mark.django_db


@pytest.fixture
def admin():
    return User.objects.create_user(
        email="ws2n-adm@example.com", password="x",
        is_superuser=True, is_staff=True, role=UserRole.SYSTEM_ADMIN,
    )


@pytest.fixture
def officer():
    return User.objects.create_user(
        email="ws2n-mel@example.com", password="x", role=UserRole.MEL_OFFICER,
    )


@pytest.fixture
def record(admin):
    user = User.objects.create_user(email="ws2n-e@example.com", password="x", role=UserRole.ENTREPRENEUR)
    profile = EntrepreneurProfile.objects.create(user=user, country="UG", organisation="Co")
    profile.verify(by_user=admin)
    profile.save()
    biz = Business.objects.create(
        entrepreneur=profile, name="Agri Co", sector="Agriculture",
        business_stage=BusinessStage.MVP, country="UG",
    )
    biz.verify(by_user=admin)
    biz.save()
    rec = SMEHubTrackingRecord.objects.create(entrepreneur=profile, business=biz, is_stalled=True)
    return rec


def test_stalled_notification_has_action_url(record, officer):
    notify_newly_stalled([record], threshold_days=90)
    note = Notification.objects.filter(recipient=officer).order_by("-created_at").first()
    assert note is not None
    assert note.action_url == reverse("mel_tracking:smehub_stalled")


def test_new_tracking_record_notification_has_action_url(record, officer):
    _notify_mel_officers_new_tracking_record(record, record.entrepreneur, record.business)
    note = Notification.objects.filter(recipient=officer).order_by("-created_at").first()
    assert note is not None
    assert note.action_url == reverse(
        "mel_tracking:smehub_tracking_detail", kwargs={"pk": record.pk}
    )
