% Cross-reference names and citation display adapters; no bibliography styles.
% Part of latexbangla, LPPL 1.3c or later; copyright 2026 Adib Hasan.

% Replace only hyperref's unchanged English defaults. Its public name commands
% may already have been customized when hyperref precedes latexbangla. Compare
% definitions without expanding them, so author macros are preserved as well.
% Arguments: public name command, upstream default, localized replacement.
\cs_new_protected:Npn \__latexbangla_translate_autoref:Nnn #1#2#3
  {
    \cs_set_nopar:Npn \__latexbangla_default_autoref: {#2}
    \cs_if_eq:NNT #1 \__latexbangla_default_autoref:
      {\cs_set_nopar:Npn #1 {#3}}
  }

% Reuse Polyglossia captions. The English strings below identify the defaults
% in the tested hyperref version; they are not a second language catalogue.
% Package hooks run for either loading order. Later author definitions win too.
\AddToHook{package/hyperref/after}[latexbangla/references]
  {
    \__latexbangla_translate_autoref:Nnn \chapterautorefname {chapter}{\chaptername}
    \__latexbangla_translate_autoref:Nnn \appendixautorefname {Appendix}{\appendixname}
    \__latexbangla_translate_autoref:Nnn \figureautorefname {Figure}{\figurename}
    \__latexbangla_translate_autoref:Nnn \tableautorefname {Table}{\tablename}
    \__latexbangla_translate_autoref:Nnn \partautorefname {Part}{\partname}
    \__latexbangla_translate_autoref:Nnn \pageautorefname {page}{\pagename}
    \__latexbangla_translate_autoref:Nnn \sectionautorefname
      {section}{\prop_item:Nn \c__latexbangla_reference_names_prop {section}}
    \__latexbangla_translate_autoref:Nnn \subsectionautorefname
      {subsection}{\prop_item:Nn \c__latexbangla_reference_names_prop {subsection}}
    \__latexbangla_translate_autoref:Nnn \subsubsectionautorefname
      {subsubsection}{\prop_item:Nn \c__latexbangla_reference_names_prop {subsubsection}}
    \__latexbangla_translate_autoref:Nnn \paragraphautorefname
      {paragraph}{\prop_item:Nn \c__latexbangla_reference_names_prop {paragraph}}
    \__latexbangla_translate_autoref:Nnn \subparagraphautorefname
      {subparagraph}{\prop_item:Nn \c__latexbangla_reference_names_prop {subparagraph}}
    \__latexbangla_translate_autoref:Nnn \equationautorefname
      {Equation}{\prop_item:Nn \c__latexbangla_reference_names_prop {equation}}
    \__latexbangla_translate_autoref:Nnn \footnoteautorefname
      {footnote}{\prop_item:Nn \c__latexbangla_reference_names_prop {footnote}}
    \__latexbangla_translate_autoref:Nnn \itemautorefname
      {item}{\prop_item:Nn \c__latexbangla_reference_names_prop {item}}
  }

% cleveref has no Bengali/Assamese language option. Supply its English base
% for unnamed types and punctuation, then localize the supported names below.
% Passing the option now still allows later author options to take precedence.
\IfPackageLoadedTF{cleveref}{}{\PassOptionsToPackage{english}{cleveref}}

% cleveref keeps language defaults in @preamble commands until begin-document;
% an unsuffixed name already present here is an author's explicit choice.
% Use its public setters only for absent names, preserving either load order
% and later preamble overrides. Both scripts have identical upper/lowercase forms.
\bool_new:N \l__latexbangla_cref_capital_name_exists_bool
\cs_new_protected:Npn \__latexbangla_set_default_cref_name:nn #1#2
  {
    \bool_set:Nn \l__latexbangla_cref_capital_name_exists_bool
      {\cs_if_exist_p:c {Cref@#1@name}}
    \cs_if_exist:cF {cref@#1@name}
      {\crefname{#1}{#2}{#2\c__latexbangla_reference_plural_tl}}
    % Avoid cleveref's automatic case conversion of font/language macros.
    \bool_if:NF \l__latexbangla_cref_capital_name_exists_bool
      {\Crefname{#1}{#2}{#2\c__latexbangla_reference_plural_tl}}
  }
% Recent LaTeX kernels rebuild cleveref label data from the current counter.
% Public aliases retain appendix types in that path as well as older cleveref.
\cs_new_protected:Npn \__latexbangla_set_default_cref_alias:nn #1#2
  {\cs_if_exist:cF {cref@#1@alias} {\crefalias{#1}{#2}}}
\AddToHook{package/cleveref/after}[latexbangla/reference-names]
  {
    \cs_if_exist:NT \appendix
      {
        \AddToHook{cmd/appendix/after}[latexbangla/reference-types]
          {
            \cs_if_exist:NTF \chapter
              {
                \__latexbangla_set_default_cref_alias:nn {chapter}{appendix}
                \__latexbangla_set_default_cref_alias:nn {section}{subappendix}
                \__latexbangla_set_default_cref_alias:nn {subsection}{subsubappendix}
              }
              {
                \__latexbangla_set_default_cref_alias:nn {section}{appendix}
                \__latexbangla_set_default_cref_alias:nn {subsection}{subappendix}
                \__latexbangla_set_default_cref_alias:nn {subsubsection}{subsubappendix}
              }
          }
      }
    \clist_map_inline:nn {part,chapter,appendix,figure,table,page}
      {\__latexbangla_set_default_cref_name:nn {#1}{\use:c {#1name}}}
    \prop_map_inline:Nn \c__latexbangla_reference_names_prop
      {\__latexbangla_set_default_cref_name:nn {#1}{#2}}
    % Nested lists, subfigures and appendix levels have their own cref types.
    \clist_map_inline:nn {enumi,enumii,enumiii,enumiv,enumv}
      {\__latexbangla_set_default_cref_name:nn {#1}
        {\prop_item:Nn \c__latexbangla_reference_names_prop {item}}}
    \clist_map_inline:nn {subappendix,subsubappendix,subsubsubappendix}
      {\__latexbangla_set_default_cref_name:nn {#1}{\appendixname}}
    \__latexbangla_set_default_cref_name:nn {subfigure}{\figurename}
    \__latexbangla_set_default_cref_name:nn {subtable}{\tablename}
    % Public conjunctions are also undefined until initialization unless an
    % author has supplied them. Set all group variants to avoid English joins
    % when a reference mixes equations, figures and other types.
    \clist_map_inline:nn
      {crefpairconjunction,creflastconjunction,
       crefpairgroupconjunction,creflastgroupconjunction}
      {\cs_if_exist:cF {#1}
        {\cs_new:cpn {#1} {~\c__latexbangla_reference_pair_tl\nobreakspace}}}
    \cs_if_exist:NF \crefrangeconjunction
      {\cs_new:Npn \crefrangeconjunction
        {\c__latexbangla_reference_range_tl}}
  }

% cleveref stores \arabic-based sort keys alongside the visible reference.
% Its two numeric readers must return Western digits for TeX arithmetic, even
% when an auxiliary file contains localized keys. Decode only those keys:
% labels, page labels, type names and reset-prefix metadata stay untouched.
% Keeping this at the read boundary also covers footnotes and appendices,
% whose label-writing commands cleveref replaces separately.
\cs_new_protected:Npn \__latexbangla_restore_reference_integer:N #1
  {
    \tl_replace_all:Nnn #1 {০} {0}
    \tl_replace_all:Nnn #1 {১} {1}
    \tl_replace_all:Nnn #1 {২} {2}
    \tl_replace_all:Nnn #1 {৩} {3}
    \tl_replace_all:Nnn #1 {৪} {4}
    \tl_replace_all:Nnn #1 {৫} {5}
    \tl_replace_all:Nnn #1 {৬} {6}
    \tl_replace_all:Nnn #1 {৭} {7}
    \tl_replace_all:Nnn #1 {৮} {8}
    \tl_replace_all:Nnn #1 {৯} {9}
  }
\AddToHook{package/cleveref/after}[latexbangla/reference-sort-keys]
  {
    \bool_if:NT \g__latexbangla_convert_counters_bool
      {
        \cs_new_eq:NN \__latexbangla_original_reference_counter:nN \cref@getcounter
        \cs_new_eq:NN \__latexbangla_original_reference_page:nN \cpageref@getcounter
        \cs_set_protected:Npn \cref@getcounter #1#2
          {
            \__latexbangla_original_reference_counter:nN {#1} #2
            \__latexbangla_restore_reference_integer:N #2
          }
        \cs_set_protected:Npn \cpageref@getcounter #1#2
          {
            \__latexbangla_original_reference_page:nN {#1} #2
            \__latexbangla_restore_reference_integer:N #2
          }
      }
  }

% Citation adapters call this only at the display boundary, never while sorting
% or writing citation keys. Explicit textual labels such as [Knuth84] stay as
% written; only entirely decimal labels are converted.
\regex_const:Nn \c__latexbangla_decimal_label_regex {\A[0-9]+\Z}
\tl_new:N \l__latexbangla_citation_label_tl
\cs_new_protected:Npn \__latexbangla_format_citation_label:n #1
  {
    \group_begin:
      % Resolve numeric label macros, but preserve LaTeX's older robust
      % commands (such as \textbf) as well as e-TeX-protected commands.
      % Unrestricted e-expansion would execute parts of a styled text label.
      \protected@edef \l__latexbangla_citation_label_tl {#1}
      \regex_match:NVTF \c__latexbangla_decimal_label_regex
        \l__latexbangla_citation_label_tl
        {
          % Numeric labels may remain native inside an English bibliography,
          % even when its Latin font has no Bengali glyphs.
          \__latexbangla_select_script_font:
          \exp_args:NV \bengalidigits \l__latexbangla_citation_label_tl
        }
        {#1}
    \group_end:
  }
\cs_generate_variant:Nn \regex_match:NnTF {NV}

% Standard LaTeX stores citation display labels through bibcite when reading
% the auxiliary file. Wrap that display value, leaving citation keys, writes,
% links and bibliography counters alone. This hook must precede the aux read.
% natbib and biblatex own different data formats and use separate adapters.
\AddToHook{begindocument/before}[latexbangla/standard-citations]
  {
    \bool_if:NT \g__latexbangla_convert_counters_bool
      {
        \IfPackageLoadedTF{natbib}{}
          {
            \IfPackageLoadedTF{biblatex}{}
              {
                \cs_new_eq:NN \__latexbangla_original_bibcite:nn \bibcite
                \cs_set_protected:Npn \bibcite #1#2
                  {
                    \__latexbangla_original_bibcite:nn {#1}
                      {\__latexbangla_format_citation_label:n {#2}}
                  }
                \cs_new_eq:NN \__latexbangla_original_biblabel:n \@biblabel
                \cs_set_protected:Npn \@biblabel #1
                  {\__latexbangla_original_biblabel:n
                    {\__latexbangla_format_citation_label:n {#1}}}
              }
          }
      }
  }

% natbib exposes two display hooks. Keep its original number values available
% for sorting/compression, and retain the author's font and bracket formatting.
% Author-year mode is outside numeric localization and is left alone.
\cs_new_protected:Npn \__latexbangla_install_natbib_formats:
  {
    \ifNAT@numbers
      \cs_new_eq:NN \__latexbangla_original_citenumfont:n \citenumfont
      \cs_set_protected:Npn \citenumfont ##1
        {\__latexbangla_original_citenumfont:n
          {\__latexbangla_format_citation_label:n {##1}}}
      \cs_new_eq:NN \__latexbangla_original_bibnumfmt:n \bibnumfmt
      \cs_set_protected:Npn \bibnumfmt ##1
        {\__latexbangla_original_bibnumfmt:n
          {\__latexbangla_format_citation_label:n {##1}}}
    \fi
  }

% Preserve the selected style's existing field formatters. DeclareFieldAlias
% creates a live reference, so using it to save a formatter before redefining
% that formatter would recurse. The two reads of biblatex's format registry are
% deliberately isolated here; subsequent installation uses its public API.
% This adapter handles only numeric labels. The bibliography locale owns dates
% and field numbers; citation notes, sort keys and link destinations stay intact.
\cs_new_protected:Npn \__latexbangla_install_biblatex_formats:
  {
    \cs_new_eq:Nc \__latexbangla_original_labelnumber:n
      {abx@ffd@*@labelnumber}
    \cs_new_eq:Nc \__latexbangla_original_labelnumberwidth:n
      {abx@ffd@*@labelnumberwidth}
    \DeclareFieldFormat{labelnumber}
      {\__latexbangla_original_labelnumber:n
        {\__latexbangla_format_citation_label:n {##1}}}
    \DeclareFieldFormat{labelnumberwidth}
      {\__latexbangla_original_labelnumberwidth:n
        {\__latexbangla_format_citation_label:n {##1}}}
  }
\AddToHook{package/biblatex/after}[latexbangla/bibliography-language]
  {
    % The hook also runs immediately when biblatex was loaded first.
    % Restore the caller's expl3 catcodes after reading the adapter.
    \use:e
      {
        \exp_not:N\file_input:n {code/references/latexbangla-biblatex-output.tex}
        \int_compare:nNnT {\char_value_catcode:n{95}} = {11}
          {\exp_not:N\ExplSyntaxOn}
      }
    \NewBibliographyString{article} % Shared electronic-article label.
    % Capture upstream captions before biblatex replaces bibname/refname with
    % its own strings. A direct reference to those commands inside an .lbx
    % string would then refer back to itself. This snapshot avoids both that
    % recursion and maintaining a duplicate set of caption translations.
    \group_begin:
      \use:c {captions\g__latexbangla_language_tl}
      \cs_gset_eq:NN \__latexbangla_bibliography_name: \bibname
      \cs_gset_eq:NN \__latexbangla_references_name: \refname
    \group_end:
    \use:e {\exp_not:N \DeclareLanguageMapping
      {\g__latexbangla_language_tl}{latexbangla-\g__latexbangla_language_tl}}
  }

\AddToHook{begindocument/end}[latexbangla/citation-formats]
  {
    \bool_if:NT \g__latexbangla_convert_counters_bool
      {
        \IfPackageLoadedT{natbib}{\__latexbangla_install_natbib_formats:}
        \IfPackageLoadedT{biblatex}{\__latexbangla_install_biblatex_formats:}
      }
  }
\endinput
