defmodule MicrowavepropWeb.ContactLive.Mechanism do @moduledoc """ Display helpers for the propagation-mechanism badge shown on `/contacts/:id`. The underlying classification lives in `Microwaveprop.Propagation.MechanismClassifier`; this module just translates the atom into a human label, a daisyUI badge class, and a one-line explainer. Extracted from the `ContactLive.Show` module as part of the 2026-04 cleanup — pure functions with no LiveView coupling belong in their own file so the view itself shrinks toward render logic. """ @type mechanism :: :likely_rainscatter | :rainscatter_possible | :tropo_duct | :troposcatter | :unknown | nil @spec label(mechanism()) :: String.t() def label(:likely_rainscatter), do: "Likely Rain Scatter" def label(:rainscatter_possible), do: "Rain Scatter Possible" def label(:tropo_duct), do: "Tropospheric Duct" def label(:troposcatter), do: "Troposcatter" def label(:unknown), do: "Unclassified" def label(_), do: "Analyzing…" @spec badge_class(mechanism()) :: String.t() def badge_class(:likely_rainscatter), do: "badge-info" def badge_class(:rainscatter_possible), do: "badge-info badge-outline" def badge_class(:tropo_duct), do: "badge-warning" def badge_class(:troposcatter), do: "badge-ghost" def badge_class(:unknown), do: "badge-ghost" def badge_class(_), do: "badge-ghost" @spec explainer(mechanism()) :: String.t() def explainer(:likely_rainscatter), do: "Heavy precipitation detected inside the common volume between the two stations — the most likely carrier at this frequency and distance." def explainer(:rainscatter_possible), do: "Light-to-moderate precipitation in the common volume, no ducting signature — scatter is plausible but marginal." def explainer(:tropo_duct), do: "HRRR profile shows a trapping layer (refractivity gradient below −157 N/km) at one of the endpoints." def explainer(:troposcatter), do: "No duct, no meaningful rain inside the common volume — default tropospheric forward scatter." def explainer(:unknown), do: "Not enough radar/profile coverage to distinguish mechanisms." def explainer(_), do: "" end