% Font style declaration logic.
% This layer owns style resolution and fallback rules.

\ExplSyntaxOn

\tl_new:N \l__font_resolved_bold_tl
\tl_new:N \l__font_resolved_italic_tl
\tl_new:N \l__font_resolved_bolditalic_tl
\tl_new:N \l__font_resolved_sans_tl
\tl_new:N \l__font_resolved_sans_bold_tl
\tl_new:N \l__font_resolved_sans_italic_tl
\tl_new:N \l__font_resolved_sans_bolditalic_tl
\tl_new:N \l__font_resolved_mono_tl
\tl_new:N \l__font_resolved_mono_bold_tl

\cs_new_protected:Npn \__font_resolve_field:NN #1#2
  {
    \tl_if_blank:VTF #1
      { \tl_set_eq:NN #1 #2 }
      { }
  }

\cs_new_protected:Npn \__font_resolve_path_fallbacks:
  {
    \tl_set_eq:NN \l__font_resolved_bold_path_tl \l__font_bold_path_tl
    \tl_set_eq:NN \l__font_resolved_italic_path_tl \l__font_italic_path_tl
    \tl_set_eq:NN \l__font_resolved_bolditalic_path_tl \l__font_bolditalic_path_tl
    \tl_set_eq:NN \l__font_resolved_sans_path_tl \l__font_sans_path_tl
    \tl_set_eq:NN \l__font_resolved_sans_bold_path_tl \l__font_sans_bold_path_tl
    \tl_set_eq:NN \l__font_resolved_sans_italic_path_tl \l__font_sans_italic_path_tl
    \tl_set_eq:NN \l__font_resolved_sans_bolditalic_path_tl \l__font_sans_bolditalic_path_tl
    \tl_set_eq:NN \l__font_resolved_mono_path_tl \l__font_mono_path_tl
    \tl_set_eq:NN \l__font_resolved_mono_bold_path_tl \l__font_mono_bold_path_tl

    \__font_resolve_field:NN \l__font_resolved_bold_path_tl \l__font_path_tl
    \__font_resolve_field:NN \l__font_resolved_italic_path_tl \l__font_path_tl
    \tl_if_blank:VTF \l__font_resolved_bolditalic_path_tl
      {
        \tl_if_blank:VTF \l__font_italic_path_tl
          { \__font_resolve_field:NN \l__font_resolved_bolditalic_path_tl \l__font_resolved_bold_path_tl }
          { \tl_set_eq:NN \l__font_resolved_bolditalic_path_tl \l__font_resolved_italic_path_tl }
      }
      { }

    \__font_resolve_field:NN \l__font_resolved_sans_path_tl \l__font_path_tl
    \__font_resolve_field:NN \l__font_resolved_sans_bold_path_tl \l__font_resolved_sans_path_tl
    \tl_if_blank:VTF \l__font_resolved_sans_italic_path_tl
      {
        \tl_if_blank:VTF \l__font_sans_path_tl
          { \tl_set_eq:NN \l__font_resolved_sans_italic_path_tl \l__font_resolved_italic_path_tl }
          { \tl_set_eq:NN \l__font_resolved_sans_italic_path_tl \l__font_resolved_sans_path_tl }
      }
      { }
    \tl_if_blank:VTF \l__font_resolved_sans_bolditalic_path_tl
      {
        \tl_if_blank:VTF \l__font_sans_bold_path_tl
          { \tl_set_eq:NN \l__font_resolved_sans_bolditalic_path_tl \l__font_resolved_sans_italic_path_tl }
          { \tl_set_eq:NN \l__font_resolved_sans_bolditalic_path_tl \l__font_resolved_sans_bold_path_tl }
      }
      { }
    \__font_resolve_field:NN \l__font_resolved_mono_path_tl \l__font_path_tl
    \__font_resolve_field:NN \l__font_resolved_mono_bold_path_tl \l__font_resolved_mono_path_tl
  }

\cs_new_protected:Npn \__font_resolve_style_fallbacks:
  {
    \tl_set_eq:NN \l__font_resolved_bold_tl \l__font_bold_tl
    \tl_set_eq:NN \l__font_resolved_italic_tl \l__font_italic_tl
    \tl_set_eq:NN \l__font_resolved_bolditalic_tl \l__font_bolditalic_tl
    \tl_set_eq:NN \l__font_resolved_sans_tl \l__font_sans_tl
    \tl_set_eq:NN \l__font_resolved_sans_bold_tl \l__font_sans_bold_tl
    \tl_set_eq:NN \l__font_resolved_sans_italic_tl \l__font_sans_italic_tl
    \tl_set_eq:NN \l__font_resolved_sans_bolditalic_tl \l__font_sans_bolditalic_tl
    \tl_set_eq:NN \l__font_resolved_mono_tl \l__font_mono_tl
    \tl_set_eq:NN \l__font_resolved_mono_bold_tl \l__font_mono_bold_tl

    \__font_resolve_field:NN \l__font_resolved_bold_tl \l__font_regular_tl
    \__font_resolve_field:NN \l__font_resolved_italic_tl \l__font_regular_tl

    \tl_if_blank:VTF \l__font_resolved_bolditalic_tl
      {
        \tl_if_blank:VTF \l__font_italic_tl
          {
            \tl_if_blank:VTF \l__font_bold_tl
              { \tl_set_eq:NN \l__font_resolved_bolditalic_tl \l__font_regular_tl }
              { \tl_set_eq:NN \l__font_resolved_bolditalic_tl \l__font_resolved_bold_tl }
          }
          { \tl_set_eq:NN \l__font_resolved_bolditalic_tl \l__font_resolved_italic_tl }
      }
      { }

    \__font_resolve_field:NN \l__font_resolved_sans_tl \l__font_regular_tl
    \__font_resolve_field:NN \l__font_resolved_sans_bold_tl \l__font_resolved_sans_tl
    \tl_if_blank:VTF \l__font_resolved_sans_italic_tl
      {
        \tl_if_blank:VTF \l__font_sans_tl
          { \tl_set_eq:NN \l__font_resolved_sans_italic_tl \l__font_resolved_italic_tl }
          { \tl_set_eq:NN \l__font_resolved_sans_italic_tl \l__font_resolved_sans_tl }
      }
      { }
    \tl_if_blank:VTF \l__font_resolved_sans_bolditalic_tl
      {
        \tl_if_blank:VTF \l__font_sans_bold_tl
          { \tl_set_eq:NN \l__font_resolved_sans_bolditalic_tl \l__font_resolved_sans_italic_tl }
          { \tl_set_eq:NN \l__font_resolved_sans_bolditalic_tl \l__font_resolved_sans_bold_tl }
      }
      { }
    \__font_resolve_field:NN \l__font_resolved_mono_tl \l__font_regular_tl
    \__font_resolve_field:NN \l__font_resolved_mono_bold_tl \l__font_resolved_mono_tl
    \__font_resolve_path_fallbacks:
  }

\ExplSyntaxOff
