{% macro strategy(value, fallback='未分類策略') -%}
  {%- set labels = {
    'product_pick': '選品攻擊',
    'price_recommendation': '價格建議',
    'price_adjustment': '價格調整',
    'price_reduction': '降價攻擊',
    'price_drop': '降價攻擊',
    'discount_attack': '降價攻擊',
    'price_increase': '漲價防守',
    'margin_repair': '毛利修復',
    'inventory_clearance': '庫存去化',
    'competitor_response': '競品回應',
    'competitor_check': '競品複核',
    'promotion': '活動促銷',
    'stockout': '缺貨處理',
    'repricing': '價格重定',
    'watch': '觀察',
    'maintain': '維持價格',
    'unknown': '未分類策略'
  } -%}
  {%- if value -%}{{ labels.get(value, value|replace('_', ' ')) }}{%- else -%}{{ fallback }}{%- endif -%}
{%- endmacro %}

{% macro status(value, fallback='未分類') -%}
  {%- set labels = {
    'pending': '待處理',
    'awaiting_review': '待審核',
    'approved': '已核准',
    'rejected': '已拒絕',
    'rejected_quality': '品質拒絕',
    'rejected_hallucination': '幻覺拒絕',
    'rejected_duplicate': '重複拒絕',
    'rejected_human': '人工拒絕',
    'expired': '已過期',
    'done': '已完成',
    'completed': '已完成',
    'running': '執行中',
    'success': '成功',
    'failed': '失敗',
    'matched': '已比對',
    'unmatched': '未比對',
    'ok': '正常',
    'cache_only': '只用快取',
    'passed': '已通過',
    'error': '錯誤',
    'skipped': '已跳過',
    'unknown': '未分類'
  } -%}
  {%- if value -%}{{ labels.get(value, value|replace('_', ' ')) }}{%- else -%}{{ fallback }}{%- endif -%}
{%- endmacro %}

{% macro verdict(value, fallback='未分類') -%}
  {%- set labels = {
    'effective': '有效',
    'success': '成功',
    'positive': '正向',
    'backfired': '反效果',
    'negative': '負向',
    'failed': '失敗',
    'neutral': '中性',
    'pending': '待回收',
    'inconclusive': '尚未定論',
    'no_data': '無資料',
    'unknown': '未分類'
  } -%}
  {%- if value -%}{{ labels.get(value, value|replace('_', ' ')) }}{%- else -%}{{ fallback }}{%- endif -%}
{%- endmacro %}

{% macro plan_type(value, fallback='未分類計畫') -%}
  {%- set labels = {
    'action_plan': '行動計畫',
    'price_adjustment': '價格調整',
    'product_pick': '選品攻擊',
    'promotion_review': '活動複核',
    'stockout_followup': '缺貨跟進',
    'competitor_check': '競品複核',
    'margin_repair': '毛利修復',
    'strategy_review': '策略複核',
    'quality_review': '品質複核'
  } -%}
  {%- if value -%}{{ labels.get(value, value|replace('_', ' ')) }}{%- else -%}{{ fallback }}{%- endif -%}
{%- endmacro %}

{% macro metric(value, fallback='未分類指標') -%}
  {%- set labels = {
    'sales': '銷售',
    'revenue': '業績',
    'margin': '毛利',
    'profit': '毛利',
    'conversion': '轉換',
    'price': '價格',
    'stock': '庫存',
    'orders': '訂單',
    'unknown': '未分類指標'
  } -%}
  {%- if value -%}{{ labels.get(value, value|replace('_', ' ')) }}{%- else -%}{{ fallback }}{%- endif -%}
{%- endmacro %}

{% macro insight(value, fallback='未分類洞察') -%}
  {%- set labels = {
    'product_pick': '選品攻擊',
    'price_recommendation': '價格建議',
    'competitor_price': '競品價格',
    'sales_anomaly': '業績異常',
    'budget_strategy': '預算策略',
    'rag_feedback': 'RAG 反饋',
    'ppt_audit': 'PPT 審核',
    'quality_issue': '品質問題',
    'promotion': '活動促銷',
    'market_signal': '市場訊號',
    'strategy': '策略洞察',
    'unknown': '未分類洞察'
  } -%}
  {%- if value -%}{{ labels.get(value, value|replace('_', ' ')) }}{%- else -%}{{ fallback }}{%- endif -%}
{%- endmacro %}

{% macro provider(value, fallback='未分類供應商') -%}
  {%- set labels = {
    'gcp_ollama': '主力 Ollama',
    'ollama_secondary': '備援 Ollama',
    'ollama_111': '111 Ollama',
    'nim_via_elephant': 'NIM Elephant',
    'gemini': 'Gemini',
    'claude': 'Claude',
    'nim': 'NIM',
    'openrouter': 'OpenRouter',
    'unknown': '未分類供應商'
  } -%}
  {%- if value -%}{{ labels.get(value, value|replace('_', ' ')) }}{%- else -%}{{ fallback }}{%- endif -%}
{%- endmacro %}

{% macro source(value, fallback='未分類來源') -%}
  {%- set labels = {
    'ai_insights': 'AI 知識庫',
    'ai_learning_episodes': '學習片段',
    'ai_price_recommendations': 'AI 價格建議',
    'action_plans': '行動計畫',
    'action_outcomes': '實際結果',
    'competitor_match_attempts': '競品比對',
    'competitor_price_history': '競品價格歷史',
    'ppt_audit_results': 'PPT 審核結果'
  } -%}
  {%- if value -%}{{ labels.get(value, value|replace('_', ' ')) }}{%- else -%}{{ fallback }}{%- endif -%}
{%- endmacro %}
