import base64
import csv
import random
import uuid

from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.core.files.base import ContentFile
from django.db.models import Count, Q
from django.http import HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.utils import timezone
import resend

from .forms import (ActivityForm, NurseryAssetForm, PlantingSessionForm,
                    SignUpForm, TreeAssetForm)
from .models import Activity, Asset, Media, Organization, Profile, Species, Task
from .scoping import visible_assets
from .tasks_engine import generate_tasks, pending_tasks, task_summary
from .verification import hash_image, verify_asset

# Resend OTP service
RESEND_API_KEY = "re_gNgQLTZA_NxLkr6XYgngMQp4KgQw3Y4G5"
RESEND_FROM_EMAIL = "webappclappdev@gmail.com"

def send_otp_email(email, otp_code):
    """Send OTP code via Resend email."""
    try:
        resend.api_key = RESEND_API_KEY
        resend.Emails.send({
            "from": RESEND_FROM_EMAIL,
            "to": email,
            "subject": "🌳 Your JM3 Verification Code",
            "html": f"""<div style="font-family: Arial, sans-serif; max-width: 400px; margin: 0 auto;">
              <h2 style="color: #1b5e20;">Welcome to JM3</h2>
              <p>Your verification code is:</p>
              <h1 style="color: #1b5e20; font-size: 36px; letter-spacing: 5px; margin: 20px 0;">{otp_code}</h1>
              <p style="color: #666;">This code will expire in 10 minutes.</p>
              <p style="color: #999; font-size: 12px;">If you didn't request this code, please ignore this email.</p>
            </div>"""
        })
        return True
    except Exception as e:
        print(f"Error sending OTP email: {e}")
        return False

def generate_otp():
    """Generate a 6-digit OTP code."""
    return str(random.randint(100000, 999999))


def generate_display_name(asset):
    """Human-friendly auto name when the user doesn't type one: 'Grevillea #12'."""
    sp = asset.species.common_name.split()[0] if asset.species else "Tree"
    # Sequential per species per org (stable, no collisions).
    n = Asset.objects.filter(organization=asset.organization, asset_type="tree",
                             species=asset.species, pk__lte=asset.pk).count()
    return f"{sp} #{n}"


def _user_org(user):
    profile = getattr(user, "profile", None)
    if profile and profile.organization_id:
        return profile.organization
    return Organization.objects.first()


def save_camera_photo(instance, field_name, data_url):
    if not data_url or "," not in data_url:
        return False
    try:
        raw = base64.b64decode(data_url.split(",", 1)[1])
    except Exception:
        return False
    name = f"{field_name}_{uuid.uuid4().hex[:10]}.jpg"
    getattr(instance, field_name).save(name, ContentFile(raw), save=False)
    return True


def map_marker_color(asset):
    if asset.verification_status == "pending":
        return "#f9a825"
    if asset.health_status == "dead":
        return "#c62828"
    return "#2e7d32"


def _greeting():
    hour = timezone.localtime().hour
    if hour < 12:
        return "Good morning"
    if hour < 18:
        return "Good afternoon"
    return "Good evening"


def _timeline(asset):
    def detail(height, note):
        parts = []
        if height:
            parts.append(f"{height} cm")
        if note:
            parts.append(note)
        return " · ".join(parts)

    items = []
    for a in asset.activities.all():
        title = a.get_activity_type_display()
        if a.activity_type in ("observed", "dead") and a.health_status:
            title = a.get_health_status_display()
            if a.death_reason:
                title += f" ({a.get_death_reason_display()})"
        items.append({"when": a.created_at, "icon": a.icon, "title": title,
                      "detail": detail(a.height_cm, a.note), "photo": a.photo.url if a.photo else ""})
    items.sort(key=lambda x: x["when"], reverse=True)
    return items


# ---------------------------------------------------------------- onboarding

def welcome(request):
    if request.user.is_authenticated:
        return redirect("dashboard")
    return render(request, "trees/welcome.html")


def login_view(request):
    """Returning users sign in with their phone number (OTP placeholder).
    No username/password for normal users — phone is the identity."""
    if request.user.is_authenticated:
        return redirect("dashboard")
    error = ""
    if request.method == "POST":
        phone = request.POST.get("phone", "").strip()
        username = "u" + "".join(ch for ch in phone if ch.isdigit())
        user = User.objects.filter(username=username).first()
        if user:
            # Prototype: a real SMS OTP step goes here before login().
            login(request, user, backend="django.contrib.auth.backends.ModelBackend")
            return redirect("dashboard")
        error = "No JM3 account found for that phone number. Tap Get Started to join."
    return render(request, "trees/login.html", {"error": error})


# Reframed onboarding: identify by what you MANAGE and how you'll USE JM3,
# never by a job title. Org context is captured up front, dynamically.

# usage -> (role to assign, org_type for any org we create, does it create an org?)
USAGE_MAP = {
    "individual":   {"role": "farmer",    "org_type": None,         "creates_org": False},
    "school":       {"role": "teacher",   "org_type": "school",     "creates_org": True},
    "community":    {"role": "org_admin", "org_type": "community",  "creates_org": True},
    "organization": {"role": "org_admin", "org_type": "ngo",        "creates_org": True},
    "government":   {"role": "org_admin", "org_type": "government",  "creates_org": True},
    "other":        {"role": "farmer",    "org_type": "community",  "creates_org": False},
}
SCHOOL_ROLE_MAP = {"teacher": "teacher", "administrator": "org_admin", "student": "student"}


def ob_manage(request):
    """Screen 1 — What would you like to manage? (problems, not titles)."""
    if request.method == "POST":
        request.session["ob_manage"] = request.POST.get("manages", "trees")
        return redirect("ob_usage")
    options = [("trees", "🌳", "Trees"), ("nursery", "🌱", "Nursery"),
               ("both", "🌳 🌱", "Both")]
    return render(request, "trees/ob_manage.html", {"options": options})


def ob_usage(request):
    """Screen 2 — How will you use JM3? Everyone can answer this."""
    if request.method == "POST":
        request.session["ob_usage"] = request.POST.get("usage", "individual")
        return redirect("ob_details")
    options = [("individual", "👤", "Individual"), ("school", "🏫", "School"),
               ("community", "🌿", "Community Group"), ("organization", "🏢", "Organization"),
               ("government", "🏛️", "Government"), ("other", "➕", "Other")]
    return render(request, "trees/ob_usage.html", {"options": options})


def ob_phone(request):
    """Screen 4 — Phone number entry; generates and sends OTP via email."""
    email = request.session.get("ob_email", "")
    error = ""
    if request.method == "POST":
        phone = request.POST.get("phone", "").strip()
        username = "u" + "".join(ch for ch in phone if ch.isdigit())
        if not any(ch.isdigit() for ch in phone):
            error = "Enter a valid phone number."
        elif User.objects.filter(username=username).exists():
            error = "An account with this phone already exists. Tap Sign in instead."
        else:
            # Generate OTP and send via email
            otp_code = generate_otp()
            if send_otp_email(email, otp_code):
                request.session["ob_phone"] = phone
                request.session["ob_otp_code"] = otp_code
                return redirect("ob_otp")
            else:
                error = "Failed to send verification email. Please try again."
    return render(request, "trees/ob_phone.html", {"error": error})


def ob_otp(request):
    """Screen 5 — OTP verification (final step; creates account and signs in)."""
    if not request.session.get("ob_phone"):
        return redirect("ob_phone")

    error = ""
    if request.method == "POST":
        entered_code = request.POST.get("code", "").strip()
        stored_code = request.session.get("ob_otp_code")

        if entered_code != stored_code:
            error = "Invalid verification code. Please check and try again."
        else:
            # Create account and sign in
            phone = request.session.get("ob_phone")
            usage = request.session.get("ob_usage", "individual")
            name = request.session.get("ob_name", "")
            email = request.session.get("ob_email", "")
            occupation = request.session.get("ob_occupation", "").strip()
            org_name = request.session.get("ob_org_name", "").strip()
            members = request.session.get("ob_members", "").strip()
            school_role = request.session.get("ob_school_role", "")

            cfg = USAGE_MAP.get(usage, USAGE_MAP["individual"])
            role = SCHOOL_ROLE_MAP.get(school_role, cfg["role"]) if usage == "school" else cfg["role"]

            username = "u" + "".join(ch for ch in phone if ch.isdigit())
            user = User.objects.create_user(username=username, password=phone)
            user.first_name = name
            user.save()

            org = None
            if cfg["creates_org"] and org_name:
                org, _ = Organization.objects.get_or_create(
                    name=org_name,
                    defaults={"org_type": cfg["org_type"] or "ngo",
                              "member_count": int(members) if members.isdigit() else 0})

            Profile.objects.update_or_create(user=user, defaults={
                "role": role, "usage_type": usage,
                "manages": request.session.get("ob_manage", "trees"),
                "phone": phone, "organization": org, "email": email,
                "occupation": occupation, "workspace_name": org_name,
            })
            login(request, user, backend="django.contrib.auth.backends.ModelBackend")
            for k in ("ob_manage", "ob_usage", "ob_phone", "ob_name", "ob_email", "ob_org_name", "ob_members", "ob_school_role", "ob_otp_code"):
                request.session.pop(k, None)
            return redirect("dashboard")

    return render(request, "trees/ob_otp.html", {"phone": request.session.get("ob_phone"), "error": error})


def ob_details(request):
    """Screen 3 — Name + workspace details, dynamic based on usage_type."""
    usage = request.session.get("ob_usage", "individual")
    if not usage:
        return redirect("ob_usage")

    if request.method == "POST":
        name = request.POST.get("name", "").strip()
        email = request.POST.get("email", "").strip()
        occupation = request.POST.get("occupation", "").strip()
        org_name = request.POST.get("org_name", "").strip()
        members = request.POST.get("members", "").strip()
        school_role = request.POST.get("school_role", "")

        request.session["ob_name"] = name
        request.session["ob_email"] = email
        request.session["ob_occupation"] = occupation
        request.session["ob_org_name"] = org_name
        request.session["ob_members"] = members
        request.session["ob_school_role"] = school_role
        return redirect("ob_phone")

    return render(request, "trees/ob_details.html", {"usage": usage})


@login_required
def ob_success(request):
    return render(request, "trees/ob_success.html")


def signup(request):
    if request.user.is_authenticated:
        return redirect("dashboard")
    if request.method == "POST":
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save()
            Profile.objects.get_or_create(user=user, defaults={"role": "student"})
            login(request, user)
            return redirect("dashboard")
    else:
        form = SignUpForm()
    return render(request, "trees/signup.html", {"form": form})


@login_required
def profile(request):
    prof = getattr(request.user, "profile", None)
    return render(request, "trees/profile.html", {
        "prof": prof,
        "my_trees": Asset.objects.filter(registered_by=request.user, asset_type="tree").count(),
        "my_visits": Activity.objects.filter(user=request.user, activity_type__in=["observed", "dead"]).count(),
        "my_activities": Activity.objects.filter(user=request.user).count(),
    })


# ---------------------------------------------------------------- home / tasks

def dashboard(request):
    # The app's front door: anonymous visitors see Welcome (Screen 1), not a login.
    if not request.user.is_authenticated:
        return redirect("welcome")
    assets = visible_assets(request.user)
    generate_tasks(assets)
    prof = getattr(request.user, "profile", None)
    return render(request, "trees/home.html", {
        "greeting": _greeting(),
        "name": request.user.first_name or request.user.username,
        "summary": task_summary(assets),
        "manages": prof.manages if prof else "both",
    })


@login_required
def analytics(request):
    org = _user_org(request.user)
    trees = visible_assets(request.user).filter(asset_type="tree")
    total = trees.count()
    alive = trees.filter(health_status__in=["alive", "stressed"]).count()
    dead = trees.filter(health_status="dead").count()
    survival_rate = round(alive / total * 100, 1) if total else 0
    verified = trees.filter(verification_status="verified").count()
    suspicious = trees.filter(verification_status="suspicious").count()
    active_monitors = Activity.objects.filter(asset__in=trees).values("user").distinct().count()
    nursery_partners = visible_assets(request.user).filter(asset_type="nursery").count()
    verified_share = (verified / total) if total else 0
    environmental_score = round(survival_rate * (0.7 + 0.3 * verified_share), 1)
    grade = "A" if environmental_score >= 80 else "B" if environmental_score >= 60 else "C" if environmental_score >= 40 else "D"
    by_species = (trees.values("species__common_name")
                  .annotate(total=Count("id"), alive=Count("id", filter=Q(health_status__in=["alive", "stressed"])))
                  .order_by("-total")[:8])
    return render(request, "trees/analytics.html", {
        "user_name": request.user.first_name or request.user.username,
        "total": total, "alive": alive, "dead": dead, "survival_rate": survival_rate,
        "verified": verified, "suspicious": suspicious, "active_monitors": active_monitors,
        "nursery_partners": nursery_partners, "environmental_score": environmental_score,
        "grade": grade, "by_species": by_species,
    })


@login_required
def tasks(request):
    assets = visible_assets(request.user)
    if request.method == "POST":
        task = get_object_or_404(Task, pk=request.POST.get("task_id"), asset__in=assets)
        task.status = "done"
        task.completed_at = timezone.now()
        task.save(update_fields=["status", "completed_at"])
        return redirect("tasks")
    generate_tasks(assets)
    return render(request, "trees/tasks.html", {"tasks": pending_tasks(assets).select_related("asset")})


# ---------------------------------------------------------------- nurseries

@login_required
def nursery_list(request):
    nurseries = visible_assets(request.user).filter(asset_type="nursery").prefetch_related("species_available")
    return render(request, "trees/nursery_list.html", {"nurseries": nurseries})


@login_required
def nursery_create(request):
    if request.method == "POST":
        form = NurseryAssetForm(request.POST)
        if form.is_valid():
            nursery = form.save(commit=False)
            nursery.asset_type = "nursery"
            nursery.organization = _user_org(request.user)
            nursery.registered_by = request.user
            save_camera_photo(nursery, "photo", request.POST.get("photo_data"))
            nursery.save()
            form.save_m2m()
            verify_asset(nursery)
            Activity.objects.create(asset=nursery, activity_type="planted", user=request.user,
                                    latitude=nursery.latitude, longitude=nursery.longitude, note="Nursery registered")
            if nursery.photo:
                Media.objects.create(asset=nursery, image=nursery.photo, user=request.user,
                                     latitude=nursery.latitude, longitude=nursery.longitude,
                                     device=request.META.get("HTTP_USER_AGENT", "")[:200], sha256=hash_image(nursery.photo))
            return render(request, "trees/nursery_added.html", {"nursery": nursery})
    else:
        form = NurseryAssetForm()
    return render(request, "trees/register_nursery.html", {"form": form})


# ---------------------------------------------------------------- trees / assets

@login_required
def select_asset_owner(request, asset_type="tree"):
    """Select who owns this asset (Me, My School, My Organization)."""
    prof = getattr(request.user, "profile", None)

    # Determine available ownership options based on user profile
    options = [("personal", "🌳 Me")]
    if prof and prof.organization:
        if prof.usage_type == "school":
            options.append(("school", "🏫 My School"))
        elif prof.usage_type in ("organization", "government"):
            options.append(("org", "🏢 My Organization"))
        elif prof.usage_type == "community":
            options.append(("org", "🌿 My Community Group"))

    if request.method == "POST":
        owner_type = request.POST.get("owner_type", "personal")
        request.session["asset_owner_type"] = owner_type
        return redirect("register_tree" if asset_type == "tree" else "nursery_create")

    return render(request, "trees/select_asset_owner.html", {
        "asset_type": asset_type,
        "options": options,
    })


@login_required
def register_tree(request):
    if request.method == "POST":
        form = TreeAssetForm(request.POST)
        if form.is_valid():
            tree = form.save(commit=False)
            tree.asset_type = "tree"
            tree.organization = _user_org(request.user)
            tree.registered_by = request.user
            tree.device_info = request.META.get("HTTP_USER_AGENT", "")[:200]
            save_camera_photo(tree, "photo", request.POST.get("photo_data"))
            tree.save()
            if not tree.name:                       # auto human-friendly name
                tree.name = generate_display_name(tree)
                tree.save(update_fields=["name"])
            verify_asset(tree)
            Activity.objects.create(asset=tree, activity_type="planted", user=request.user,
                                    latitude=tree.latitude, longitude=tree.longitude, note="Planted & registered")
            if tree.photo:
                Media.objects.create(asset=tree, image=tree.photo, user=request.user,
                                     latitude=tree.latitude, longitude=tree.longitude,
                                     device=tree.device_info, sha256=tree.photo_hash)
            # Optional initial height from the "More details" section -> an observation.
            height = request.POST.get("height_cm")
            if height:
                try:
                    Activity.objects.create(asset=tree, activity_type="observed", user=request.user,
                                            health_status="alive", height_cm=float(height),
                                            latitude=tree.latitude, longitude=tree.longitude)
                except ValueError:
                    pass
            return render(request, "trees/tree_added.html", {"tree": tree})
    else:
        form = TreeAssetForm()
    return render(request, "trees/register_tree.html", {"form": form})


@login_required
def register_session(request):
    if request.method == "POST":
        form = PlantingSessionForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            org = _user_org(request.user)
            planted = cd["planted_date"] or timezone.localdate()
            created = []
            for i in range(cd["quantity"]):
                tree = Asset(asset_type="tree", organization=org, species=cd["species"],
                             latitude=cd["latitude"], longitude=cd["longitude"], county=cd["county"],
                             planted_date=planted, registered_by=request.user, verification_status="pending",
                             verification_notes="Bulk planting session — verify individually")
                if i == 0:
                    save_camera_photo(tree, "photo", request.POST.get("photo_data"))
                tree.save()
                Activity.objects.create(asset=tree, activity_type="planted", user=request.user,
                                        latitude=tree.latitude, longitude=tree.longitude, note="Bulk planting session")
                created.append(tree)
            return render(request, "trees/session_done.html", {"count": len(created), "species": cd["species"]})
    else:
        form = PlantingSessionForm()
    return render(request, "trees/session_form.html", {"form": form})


@login_required
def tree_list(request):
    qs = visible_assets(request.user).filter(asset_type="tree").select_related("species", "organization", "source_nursery")
    query = request.GET.get("q", "")
    if query:
        qs = qs.filter(Q(tag_code__icontains=query) | Q(name__icontains=query)
                       | Q(species__common_name__icontains=query) | Q(county__icontains=query))
    return render(request, "trees/tree_list.html", {"trees": qs, "query": query})


@login_required
def tree_detail(request, pk):
    tree = get_object_or_404(visible_assets(request.user).select_related("species", "organization", "source_nursery"), pk=pk)
    return render(request, "trees/tree_detail.html", {"tree": tree, "timeline": _timeline(tree)})


@login_required
def record_activity(request, pk):
    asset = get_object_or_404(visible_assets(request.user), pk=pk)
    if request.method == "POST":
        form = ActivityForm(request.POST)
        if form.is_valid():
            activity = form.save(commit=False)
            activity.asset = asset
            activity.user = request.user
            activity.latitude = asset.latitude
            activity.longitude = asset.longitude
            save_camera_photo(activity, "photo", request.POST.get("photo_data"))
            activity.save()
            if activity.photo:
                Media.objects.create(asset=asset, activity=activity, image=activity.photo, user=request.user,
                                     latitude=asset.latitude, longitude=asset.longitude,
                                     device=request.META.get("HTTP_USER_AGENT", "")[:200], sha256=hash_image(activity.photo))
            return redirect("tree_detail", pk=asset.pk)
    else:
        form = ActivityForm()
    return render(request, "trees/activity_form.html", {"form": form, "tree": asset})


# ---------------------------------------------------------------- monitoring

@login_required
def monitor_home(request):
    qs = visible_assets(request.user).filter(asset_type="tree").select_related("species", "organization")
    query = request.GET.get("q", "")
    if query:
        qs = qs.filter(Q(tag_code__icontains=query) | Q(name__icontains=query)
                       | Q(species__common_name__icontains=query) | Q(county__icontains=query))
    # Trees due first (never checked, or checked longest ago), then the rest.
    trees = sorted(qs[:60], key=lambda t: (t.last_checked is not None, t.last_checked or timezone.now()))
    return render(request, "trees/monitor_home.html", {"trees": trees, "query": query})


@login_required
def monitor_tree(request, pk):
    tree = get_object_or_404(visible_assets(request.user), pk=pk)
    if request.method == "POST":
        status = "dead" if request.POST.get("status") == "dead" else "alive"
        height = request.POST.get("height_cm") or None
        try:
            height = float(height) if height else None
        except ValueError:
            height = None
        activity = Activity.objects.create(
            asset=tree, activity_type="dead" if status == "dead" else "observed",
            user=request.user, health_status=status,
            death_reason=request.POST.get("death_reason", "") if status == "dead" else "",
            height_cm=height, note=request.POST.get("notes", ""),
            latitude=tree.latitude, longitude=tree.longitude,
        )
        save_camera_photo(activity, "photo", request.POST.get("photo_data"))
        if activity.photo:
            activity.save(update_fields=["photo"])
        if tree.health_status != status:
            tree.health_status = status
            tree.save(update_fields=["health_status"])
        Task.objects.filter(asset=tree, task_type="check_tree", status="pending").update(
            status="done", completed_at=timezone.now())
        return redirect("tree_detail", pk=tree.pk)
    return render(request, "trees/monitor.html", {"tree": tree})


# ---------------------------------------------------------------- GIS

@login_required
def map_view(request):
    prof = getattr(request.user, "profile", None)
    is_admin = request.user.is_superuser or (prof and prof.role == "jm3_admin")
    return render(request, "trees/map.html", {
        "organizations": Organization.objects.all() if is_admin else [],
        "species_list": Species.objects.all(),
        "is_admin": is_admin,
    })


@login_required
def trees_geojson(request):
    qs = visible_assets(request.user).filter(asset_type="tree").select_related("species", "organization")
    for param, field in [("organization", "organization_id"), ("species", "species_id"),
                          ("health", "health_status"), ("verification", "verification_status")]:
        value = request.GET.get(param)
        if value:
            qs = qs.filter(**{field: value})
    features = [{
        "type": "Feature",
        "geometry": {"type": "Point", "coordinates": [t.longitude, t.latitude]},
        "properties": {
            "tag_code": t.tag_code, "species": t.species.common_name if t.species else "—",
            "organization": t.organization.name, "health_label": t.get_health_status_display(),
            "verification": t.verification_status, "color": map_marker_color(t),
            "planted_date": t.planted_date.isoformat(),
            "photo": t.photo.url if t.photo else "", "url": f"/trees/{t.id}/",
        },
    } for t in qs]
    return JsonResponse({"type": "FeatureCollection", "features": features})


@login_required
def nurseries_geojson(request):
    features = [{
        "type": "Feature",
        "geometry": {"type": "Point", "coordinates": [n.longitude, n.latitude]},
        "properties": {"name": n.display_name, "owner": n.owner_name, "capacity": n.seedling_capacity,
                       "survival": n.verified_survival_rate, "sourced": n.sourced_trees},
    } for n in visible_assets(request.user).filter(asset_type="nursery")]
    return JsonResponse({"type": "FeatureCollection", "features": features})


# ---------------------------------------------------------------- reports

@login_required
def reports(request):
    assets = visible_assets(request.user)
    nurseries = sorted(assets.filter(asset_type="nursery"),
                       key=lambda n: (n.verified_survival_rate is None, -(n.verified_survival_rate or 0)))
    trees = assets.filter(asset_type="tree")
    by_county = (trees.exclude(county="").values("county")
                 .annotate(total=Count("id"), alive=Count("id", filter=Q(health_status__in=["alive", "stressed"])))
                 .order_by("-total"))
    by_species = (trees.values("species__common_name")
                  .annotate(total=Count("id"), alive=Count("id", filter=Q(health_status__in=["alive", "stressed"])))
                  .order_by("-total"))
    return render(request, "trees/reports.html", {"nurseries": nurseries, "by_county": by_county, "by_species": by_species})


@login_required
def report_csv(request):
    response = HttpResponse(content_type="text/csv")
    response["Content-Disposition"] = 'attachment; filename="jm3_asset_report.csv"'
    writer = csv.writer(response)
    writer.writerow(["Asset ID", "Type", "Organization", "Species", "Nursery", "County", "Planted", "Health", "Verification"])
    for a in visible_assets(request.user).select_related("species", "organization", "source_nursery"):
        writer.writerow([a.tag_code, a.get_asset_type_display(), a.organization.name,
                         a.species.common_name if a.species else "",
                         a.source_nursery.display_name if a.source_nursery else "", a.county, a.planted_date,
                         a.get_health_status_display(), a.get_verification_status_display()])
    return response
