<.breadcrumb items={ [%{label: "Dashboard", navigate: ~p"/dashboard"}, %{label: "Trace"}] ++ if(@trace && @trace.subscriber, do: [%{label: @trace.subscriber.name}], else: []) } />
<%!-- Search Bar --%>
<.icon name="hero-magnifying-glass" class="h-6 w-6 text-gray-400 flex-shrink-0" />
<%!-- Search Results --%>
<%!-- No Results --%>
<.icon name="hero-magnifying-glass" class="h-12 w-12 mx-auto mb-3 opacity-50" />

No results found

{t("Try searching by customer name, IP address, account ID, or device name")}

<%!-- Trace View --%>
<%!-- Known Issues Callout --%> <.issues_callout trace={@trace} /> <%!-- Subscriber + Connection --%>
<%!-- Subscriber Info --%>

<.icon name="hero-user" class="h-4 w-4 inline" /> Subscriber

<%= if @trace.subscriber do %>
{@trace.subscriber.name}
{String.capitalize(@trace.subscriber.plan)} — ${if(is_struct(@trace.subscriber.plan_mrr, Decimal), do: Decimal.round(@trace.subscriber.plan_mrr, 2), else: @trace.subscriber.plan_mrr )}/mo
↓ {format_speed(@trace.subscriber.speed_download)} / ↑ {format_speed( @trace.subscriber.speed_upload )}
Account #: {@trace.subscriber.account_id}
<.icon name="hero-map-pin" class="h-3.5 w-3.5 inline" /> {@trace.subscriber.address}
Customer since: {Calendar.strftime(@trace.subscriber.customer_since, "%b %Y")}
{@trace.subscriber.status || "unknown"} MRR: ${if(is_struct(@trace.subscriber.mrr, Decimal), do: Decimal.round(@trace.subscriber.mrr, 2), else: @trace.subscriber.mrr )}
<% else %>

{t("No subscriber info available")}

<% end %>
<%!-- Connection / Device Info --%>

<.icon name="hero-signal" class="h-4 w-4 inline" /> Connection

<%= if @trace.device do %>
<.link navigate={~p"/devices/#{@trace.device.id}"} class="hover:text-blue-600 dark:hover:text-blue-400" > {@trace.device.name || @trace.device.ip_address}
<.link navigate={~p"/sites/#{@trace.device.site.id}"} class="hover:text-blue-600" > {@trace.device.site.name}
Status: {String.capitalize(to_string(@trace.device.status))}
IP: {@trace.device.ip_address}
Last checked: {format_relative_time(@trace.device.last_checked_at)}
{t("Preseem AP")}
{@trace.access_point.name}
{@trace.access_point.model}
<% else %>

No device linked

<% end %>
<%!-- QoE Metrics + Peer Impact --%>
<%!-- QoE Metrics --%>

<.icon name="hero-chart-bar" class="h-4 w-4 inline" /> QoE Metrics (from Preseem)

<%= if @trace.qoe_metrics do %>
<.metric_card label={t("QoE Score")} value={format_score(@trace.qoe_metrics.qoe_score)} quality={score_quality(@trace.qoe_metrics.qoe_score)} /> <.metric_card label={t("Capacity")} value={format_score(@trace.qoe_metrics.capacity_score)} quality={score_quality(@trace.qoe_metrics.capacity_score)} /> <.metric_card label={t("RF Score")} value={format_score(@trace.qoe_metrics.rf_score)} quality={score_quality(@trace.qoe_metrics.rf_score)} /> <.metric_card label={t("Airtime")} value={format_pct(@trace.qoe_metrics.airtime_utilization)} quality={airtime_quality(@trace.qoe_metrics.airtime_utilization)} />
<%= if @trace.qoe_metrics.latest_metric do %>
{t("Latest Metrics")}
Latency {format_ms(@trace.qoe_metrics.latest_metric.avg_latency)}
Jitter {format_ms(@trace.qoe_metrics.latest_metric.avg_jitter)}
Loss {format_pct(@trace.qoe_metrics.latest_metric.avg_loss)}
Throughput {format_throughput(@trace.qoe_metrics.latest_metric.avg_throughput)}
<% end %> <% else %>

{t("No Preseem data available")}

<% end %>
<%!-- Peer Impact --%>

<.icon name="hero-users" class="h-4 w-4 inline" /> Peer Impact

<%= if @trace.peer_impact do %>
{t("Subscribers on this AP")} {@trace.peer_impact.subscriber_count}
{t("Other APs on device")} {@trace.peer_impact.peer_ap_count}
{t("Active alerts on device")} 0, do: "text-red-600", else: "text-green-600" ) ]}> {@trace.peer_impact.active_alert_count}
{t("Peer APs")}
{ap.name}
{ap.subscriber_count || 0} subs {format_score(ap.qoe_score)}
<% else %>

{t("No peer data available")}

<% end %>
<%!-- Active Alerts --%>

<.icon name="hero-bell-alert" class="h-4 w-4 inline" /> Recent Alerts

<%= if @trace.alerts == [] do %>
<.icon name="hero-check-circle" class="h-5 w-5" /> No alerts — all clear
<% else %>
{format_alert_type(alert.alert_type)} — {alert.message}
{format_relative_time(alert.triggered_at)}
resolved active
<% end %>
<%!-- Recent Activity: Config Changes + Insights --%>
<%!-- Config Changes --%>

<.icon name="hero-document-text" class="h-4 w-4 inline" /> Config Changes (24h)

<%= if @trace.config_changes == [] do %>
<.icon name="hero-check-circle" class="h-5 w-5" /> No config changes in last 24h
<% else %>
{Map.get(change, :changed_sections, []) |> Enum.join(", ")} {format_relative_time(change.changed_at)}
{change.diff_summary}
<% end %>
<%!-- Active Insights --%>

<.icon name="hero-light-bulb" class="h-4 w-4 inline" /> Active Insights

<%= if @trace.insights == [] do %>
<.icon name="hero-check-circle" class="h-5 w-5" /> No active insights
<% else %>
{insight.title}
{insight.description}
<% end %>
<%!-- Inventory Items --%>

<.icon name="hero-cube" class="h-4 w-4 inline" /> Equipment (from Gaiia)

Name IP Model Serial Status
{item.name} {item.ip_address} {item.model_name} {item.serial_number} {item.status}
<%!-- Empty State --%>
<.icon name="hero-magnifying-glass-circle" class="h-16 w-16 mx-auto mb-4 text-gray-300 dark:text-gray-600" />

{t("Subscriber Trace")}

{t("Search for a customer by name, IP address, account ID, or device name to see their full network status at a glance.")}