{% macro render_metric(metric, can_edit=False, show_rename=False) %}
{% set prog = metric.progress or {} %}
{% set cfg = metric.config or {} %}
{# ── Заголовок ── #}
{% if metric.ai_prompt %}
{{ metric.label }}
{% else %}
{{ metric.label }}
{% endif %}
{% if can_edit and show_rename %}
{% endif %}
{# ── Кнопка удаления (абсолютная, правый верхний угол) ── #}
{% if can_edit %}
{% endif %}
{# ════════════════════════════════════════════════════════════════════════
CHECKPOINTS — контрольные точки
════════════════════════════════════════════════════════════════════════ #}
{% if metric.type == 'checkpoints' %}
{% set total = cfg.get('total', 0) | int %}
{% set checked = prog.get('checked', []) %}
{% set done = checked | length %}
{% set pct = (done / total * 100) | int if total else 0 %}
{{ done }}/{{ total }}
{% for i in range(total) %}
{% set lbl = cfg.get('labels', [])[i] if cfg.get('labels') and i < (cfg.get('labels') | length) else (i + 1) | string %}
{% if can_edit %}
{% else %}
{{ lbl }}
{% endif %}
{% endfor %}
{% if not total %}Не настроено{% endif %}
{# ════════════════════════════════════════════════════════════════════════
PROGRESS BAR — накопление баллов
════════════════════════════════════════════════════════════════════════ #}
{% elif metric.type == 'progress_bar' %}
{% set cur = prog.get('current', 0) %}
{% set mx = cfg.get('max', 100) | float %}
{% set pct = [[cur / mx * 100, 0] | max, 100] | min | int if mx else 0 %}
{{ pct }}%
{{ cur }} / {{ mx | int }}{% if cfg.get('unit') %} {{ cfg.get('unit') }}{% endif %}
{% if can_edit %}
{% endif %}
{# ════════════════════════════════════════════════════════════════════════
COUNTER — счётчик
════════════════════════════════════════════════════════════════════════ #}
{% elif metric.type == 'counter' %}
{% set cur = prog.get('current', 0) %}
{% set mx = cfg.get('max') | int if cfg.get('max') else 0 %}
{% if can_edit %}{% endif %}
{{ cur }}
{%- if mx %}/ {{ mx }}{% endif %}
{%- if cfg.get('unit') %} {{ cfg.get('unit') }}{% endif -%}