% Copyright 2026 Open-Guji (https://github.com/open-guji)
%
% Licensed under the Apache License, Version 2.0 (the "License");
% you may not use this file except in compliance with the License.
% You may obtain a copy of the License at
%
%     http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS,
% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
% See the License for the specific language governing permissions and
% limitations under the License.

\ProvidesExplPackage{guji/luatex-cn-guji-danye}{2026/02/18} {0.3.0}{Single page support for traditional Chinese books}

% ============================================================================
% SinglePage Environment (单页)
% Creates a single page (half of spread) with split disabled
% Usage: \begin{SinglePage}[additional options] ... \end{SinglePage}
% Automatically calculates: paper-width/2, margin-left/2, margin-right/2
% Height and margin-top/bottom are inherited from current settings
% ============================================================================

\RequirePackage{environ}

% Storage for calculated single page dimensions
\tl_new:N \l__luatexcn_danye_paper_width_tl
\tl_new:N \l__luatexcn_danye_margin_left_tl
\tl_new:N \l__luatexcn_danye_margin_right_tl

\NewEnviron{SinglePage}[1][]{%
    \clearpage
    % Save current settings in Lua (includes split state)
    \lua_now:n { require('core.luatex-cn-core-page').save() }
    % Calculate single page dimensions from current spread settings
    \tl_set:Nx \l__luatexcn_danye_paper_width_tl { \lua_now:n { tex.sprint(require('guji.luatex-cn-guji-danye').get_paper_width_str()) } }
    \tl_set:Nx \l__luatexcn_danye_margin_left_tl { \lua_now:n { tex.sprint(require('guji.luatex-cn-guji-danye').get_margin_left_str()) } }
    \tl_set:Nx \l__luatexcn_danye_margin_right_tl { \lua_now:n { tex.sprint(require('guji.luatex-cn-guji-danye').get_margin_right_str()) } }
    % Apply single page settings
    \keys_set:nn { luatexcn / page }
      {
        paper-width = \l__luatexcn_danye_paper_width_tl,
        margin-left = \l__luatexcn_danye_margin_left_tl,
        margin-right = \l__luatexcn_danye_margin_right_tl,
        page-split-enabled = false,
        #1
      }
    % SinglePage defaults: no banxin (single page has no center column)
    \keys_set:nn { luatexcn / banxin } { banxin = false }
    % Sync page dimensions to Lua
    \lua_now:e {
      local~page~=~require('core.luatex-cn-core-page');~
      page.setup({
        paper_width~=~"\l__luatexcn_page_paper_width_tl",
        paper_height~=~"\l__luatexcn_page_paper_height_tl",
        margin_top~=~"\l__luatexcn_page_margin_top_tl",
        margin_bottom~=~"\l__luatexcn_page_margin_bottom_tl",
        margin_left~=~"\l__luatexcn_page_margin_left_tl",
        margin_right~=~"\l__luatexcn_page_margin_right_tl"
      });~
    }
    \luatexcn_apply_geometry:
    % Disable split page
    \lua_now:n { require('core.luatex-cn-core-page').split.disable() }
    \BODY
    \clearpage
    % Restore previous settings from Lua (includes split state)
    \lua_now:n { require('core.luatex-cn-core-page').restore() }
    % Sync restored Lua state back to TeX token lists
    \__luatexcn_page_sync_from_lua:
    % Globally restore paper/page dimensions so they survive \NewEnviron group end
    \__luatexcn_page_restore_dims_globally:
}

% ============================================================================
% EmptySinglePage Environment (空白页)
% A single page with no borders at all (no column borders, no outer border)
% Usage: \begin{EmptySinglePage}[additional options] ... \end{EmptySinglePage}
% ============================================================================
\tl_new:N \l__luatexcn_empty_danye_body_tl
\NewEnviron{EmptySinglePage}[1][]{%
  \tl_set_eq:NN \l__luatexcn_empty_danye_body_tl \BODY
  \begin{SinglePage}[#1]
    \keys_set:nn { luatexcn / content } { border = false, outer-border = false }
    \begin{正文}
      \char"200B\relax % Zero-width space placeholder to ensure page renders even when empty
      \l__luatexcn_empty_danye_body_tl
    \end{正文}
  \end{SinglePage}
}

% ============================================================================
% CJK Aliases (中文别名)
% ============================================================================
% Simplified Chinese / 简体
\NewEnvironmentCopy{单页}{SinglePage}
\NewEnvironmentCopy{空白页}{EmptySinglePage}
% Traditional Chinese / 繁体
\NewEnvironmentCopy{單頁}{SinglePage}
\NewEnvironmentCopy{空白頁}{EmptySinglePage}

\endinput
