defmodule CobblemonUiWeb.BattleComponents do
use CobblemonUiWeb, :html
import CobblemonUiWeb.PokemonComponents, only: [tier_badge: 1]
attr :battle, :map, required: true
attr :player_id, :string, required: true
attr :tier_list, :map, default: %{}
def battle_panel(assigns) do
~H"""
<%!-- Header --%>
Active Battle
<%!-- Actors --%>
<%= for {actor, idx} <- Enum.with_index(@battle.actors) do %>
<%!-- Divider between actors on mobile, VS bar on desktop --%>
<%!-- Actor header --%>
<%= if actor.type == "player" do %>
<.icon name="hero-user" class="size-4 text-primary" />
<% else %>
<.icon name="hero-cpu-chip" class="size-4 text-warning" />
<% end %>
{actor.name}
{actor.type}
<%!-- VS badge for desktop --%>
VS
<%!-- Pokemon cards --%>
<%= for poke <- actor.active_pokemon do %>
<% tier = Map.get(@tier_list, String.downcase(poke.species || ""), nil) %>
<% hp_pct = if poke.max_hp > 0, do: Float.round(poke.hp / poke.max_hp * 100, 1), else: 0.0 %>
<%!-- Sprite --%>
<%!-- Info --%>
<%!-- Name row --%>
{poke.species}
Lv.{poke.level}
<.tier_badge :if={tier} tier={tier} species={poke.species} compact={true} />
<%!-- HP bar --%>
"bg-base-content/20"
hp_pct > 50 -> "bg-success"
hp_pct > 20 -> "bg-warning"
true -> "bg-error"
end
]}
style={"width: #{hp_pct}%"}
/>
<%!-- HP numbers --%>
HP
{poke.hp} / {poke.max_hp}
({hp_pct}%)
<% end %>
<% end %>
"""
end
end