"""Phase 8 — SMEHubFeedbackOverviewView smoke tests."""
from __future__ import annotations

from datetime import timedelta

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

from apps.core.permissions.roles import UserRole
from apps.mel.tracking.models import (
    SMEHubBeneficiaryFeedback,
    SMEHubTrackingRecord,
)
from apps.smehub.onboarding.models import (
    Business,
    BusinessBaseline,
    BusinessStage,
    EntrepreneurProfile,
)
from apps.smehub.onboarding import signals as onb_signals

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


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


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


@pytest.fixture
def record(admin):
    user = User.objects.create_user(
        email="ent-fb8@example.com", password="x", role=UserRole.ENTREPRENEUR,
    )
    profile = EntrepreneurProfile.objects.create(user=user, country="UG")
    profile.verify(by_user=admin)
    profile.save()
    biz = Business.objects.create(
        entrepreneur=profile, name="FB8 Biz",
        sector="Agriculture", business_stage=BusinessStage.MVP, country="UG",
    )
    baseline = BusinessBaseline.objects.create(
        business=biz, business_stage_at_entry=BusinessStage.MVP,
    )
    biz.verify(by_user=admin)
    biz.save()
    onb_signals.smehub_baseline_initialised.send(
        sender=BusinessBaseline, business=biz, baseline=baseline, entrepreneur=profile,
    )
    return SMEHubTrackingRecord.objects.get(entrepreneur=profile)


def test_overview_blocks_anonymous(client):
    resp = client.get(reverse("mel_tracking:smehub_feedback_overview"))
    assert resp.status_code in (302, 403)


def test_overview_blocks_entrepreneur(client, record):
    client.force_login(record.entrepreneur.user)
    resp = client.get(reverse("mel_tracking:smehub_feedback_overview"))
    assert resp.status_code == 403


def test_overview_renders_for_mel_officer(client, mel_officer, record):
    SMEHubBeneficiaryFeedback.objects.create(
        tracking_record=record,
        stage=SMEHubBeneficiaryFeedback.Stage.POST_INCUBATION,
        trigger_event="cohort_member_completed:1",
        status=SMEHubBeneficiaryFeedback.Status.SENT,
        due_at=timezone.now() + timedelta(days=14),
    )
    SMEHubBeneficiaryFeedback.objects.create(
        tracking_record=record,
        stage=SMEHubBeneficiaryFeedback.Stage.POST_CONNECTION,
        trigger_event="connection_accepted:1",
        status=SMEHubBeneficiaryFeedback.Status.COMPLETED,
        completed_at=timezone.now(),
    )
    client.force_login(mel_officer)
    resp = client.get(reverse("mel_tracking:smehub_feedback_overview"))
    assert resp.status_code == 200
    assert b"Survey overview" in resp.content
    # Per-stage tile labels must render
    assert b"Post-incubation" in resp.content
    assert b"Post-connection" in resp.content


def test_overview_lists_top_non_responders(client, mel_officer, record):
    SMEHubTrackingRecord.objects.filter(pk=record.pk).update(feedback_non_response_count=3)
    client.force_login(mel_officer)
    resp = client.get(reverse("mel_tracking:smehub_feedback_overview"))
    assert resp.status_code == 200
    assert record.entrepreneur.user.email.encode() in resp.content
