% Public layout-preset selection interface.
% Public layout usage loads named presets, not raw components.

\ExplSyntaxOn

\tl_new:N \l__layout_targets_tl
\tl_new:N \l__layout_page_tl
\tl_new:N \l__layout_text_tl
\tl_new:N \l__layout_head_tl
\tl_new:N \l__layout_book_tl
\tl_new:N \l__layout_slides_tl

\cs_new_protected:Npn \__layout_preset_reset_state:
  {
    \tl_clear:N \l__layout_targets_tl
    \tl_clear:N \l__layout_page_tl
    \tl_clear:N \l__layout_text_tl
    \tl_clear:N \l__layout_head_tl
    \tl_clear:N \l__layout_book_tl
    \tl_clear:N \l__layout_slides_tl
  }

\keys_define:nn { layout/preset }
  {
    targets .tl_set:N = \l__layout_targets_tl,
    page .tl_set:N = \l__layout_page_tl,
    text .tl_set:N = \l__layout_text_tl,
    head .tl_set:N = \l__layout_head_tl,
    book .tl_set:N = \l__layout_book_tl,
    slides .tl_set:N = \l__layout_slides_tl,
  }

\cs_new_protected:Npn \__layout_preset_apply_defaults:
  {
    \tl_if_blank:VTF \l__layout_targets_tl
      { \tl_set:Nn \l__layout_targets_tl { \LayoutDefaultTargets } }
      { }
  }

\cs_new_protected:Npn \__layout_preset_validate_compatibility:
  {
    \exp_args:NV \__layout_targets_allow_current:nTF \l__layout_targets_tl
      { }
      {
        \PackageError{layout-preset}
          {Layout~preset~not~compatible~with~current~document~class}
          {
            Current~class~=~\LayoutCurrentClass.\MessageBreak
            Allowed~targets~=~\tl_use:N \l__layout_targets_tl.
          }
      }
  }

\cs_new_protected:Npn \__layout_apply_preset:
  {
    \__layout_preset_apply_defaults:
    \__layout_preset_validate_compatibility:
    \exp_args:NV \__layout_apply_component_list:n \l__layout_page_tl
    \exp_args:NV \__layout_apply_component_list:n \l__layout_text_tl
    \exp_args:NV \__layout_apply_component_list:n \l__layout_head_tl
    \exp_args:NV \__layout_apply_component_list:n \l__layout_book_tl
    \exp_args:NV \__layout_apply_component_list:n \l__layout_slides_tl
  }

\NewDocumentCommand{\LayoutPresetDeclare}{m}
  {
    \__layout_preset_reset_state:
    \keys_set:nn { layout/preset } {#1}
    \__layout_apply_preset:
  }

\ExplSyntaxOff
