%
% Copyright (c) 2024 Kangwei Xia
% Released under the LaTeX Project Public License v1.3c License.
% Repository: https://github.com/xkwxdyy/exam-zh
%            https://gitee.com/xkwxdyy/exam-zh (mirror)
%

\NeedsTeXFormat{LaTeX2e}

\RequirePackage { expl3 }
\RequirePackage { xparse }
\RequirePackage { exam-zh-circlednumber }

\ProvidesExplPackage {exam-zh-counter} {2026-07-12} {v0.3.0}
  {exam-zh shared counter registry}

\cs_new:Npn \__examzh_counter_value:n #1
  {
    \int_if_exist:cTF { c@ #1 }
      { \int_use:c { c@ #1 } }
      { \int_eval:n {#1} }
  }

\msg_new:nnn { exam-zh / counter } { deprecated-circlednumber-star }
  {
    The~command~\token_to_str:N \circlednumber*~is~deprecated;~
    use~\token_to_str:N \tikzcirclednumber~instead.
  }

% Both public commands accept a LaTeX counter name or an integer expression.
% The starred legacy form is retained for compatibility during deprecation.
\NewDocumentCommand \circlednumber { s m }
  {
    \IfBooleanTF {#1}
      {
        \msg_warning:nn { exam-zh / counter }
          { deprecated-circlednumber-star }
        \exp_args:Nx \__examzh_tikz_circled_number:n
          { \__examzh_counter_value:n {#2} }
      }
      {
        \exp_args:Nx \__examzh_font_circled_number:n
          { \__examzh_counter_value:n {#2} }
      }
  }

\NewDocumentCommand \tikzcirclednumber { m }
  {
    \exp_args:Nx \__examzh_tikz_circled_number:n
      { \__examzh_counter_value:n {#1} }
  }

% #1: token list containing the local counter bindings
% #2: public formatter command
% #3: implementation command
% #4: registry namespace
% #5: current item index expression
\cs_new_protected:Npn \__examzh_counter_register:NNNnn #1#2#3#4#5
  {
    \tl_put_right:Nn #1
      { \__examzh_counter_bind:NNnn #2 #3 {#4} {#5} }
    \cs_set_eq:cN { __examzh_counter_ #4 _save_ \cs_to_str:N #2 : } #3
    \cs_set_eq:cN { __examzh_counter_ #4 _save_ \cs_to_str:N #3 : } #3
  }

% Locally turn both the public and implementation commands into label parsers.
\cs_new_protected:Npn \__examzh_counter_bind:NNnn #1#2#3#4
  {
    \cs_set:Npn #1 { \__examzh_counter_format:Nnnn #2 {#3} {#4} }
    \cs_set:Npn #2 { \__examzh_counter_format:Nnnn #2 {#3} {#4} }
  }

\cs_new:Npn \__examzh_counter_format:Nnnn #1#2#3#4
  {
    \tl_if_eq:nnTF {#4} { * }
      {
        \use:c { __examzh_counter_ #2 _save_ \cs_to_str:N #1 : }
          { \int_eval:n {#3} }
      }
      {
        \use:c { __examzh_counter_ #2 _save_ \cs_to_str:N #1 : }
          { \__examzh_counter_value:n {#4} }
      }
  }

% enumitem uses the same `\formatter*` placeholder syntax.  Register both
% unambiguous commands when enumitem is present, without requiring it here.
\cs_new_protected:Npn \__examzh_counter_register_enumitem:
  {
    \cs_if_exist:NT \AddEnumerateCounter
      {
        \AddEnumerateCounter \circlednumber
          \__examzh_font_circled_number:n { 50 }
        \AddEnumerateCounter \tikzcirclednumber
          \__examzh_tikz_circled_number:n { 100 }
      }
  }

\AddToHook { begindocument / before }
  { \__examzh_counter_register_enumitem: }

\endinput
