% a /very/ preliminary draft – don't use it
\RequirePackage{cnltx-base}
\ProvidesPackage{cnltx-names}[\cnltx@@date\space \cnltx@@version\space \cnltx@@info]

% --------------------------------------------------------------------------
\cnltx@create@bundle@message{names}{Error}
\cnltx@create@bundle@message{names}{Warning}
\cnltx@create@bundle@message{names}{WarningNoLine}
\cnltx@create@bundle@message{names}{Info}

% \newfirstformat\foo
%
% definiert
%   => \foo{bar}       % als `benutzt' markieren, verwendet zuerst
%                      %   \foofirstformat , dann \fooformat
%   => \foo*{bar}      % nicht als `benutzt' markieren, verwendet \fooformat
%   => \fooformat      % kann später umdefiniert werden nach eigenem Geschmack
%   => \foofirstformat % kann später umdefiniert werden nach eigenem Geschmack
%   => \resetfoo       % setzt alle \foo wieder (lokal) auf unbenutzt zurück
\newrobustcmd*\newfirstformat[1]{%
  \newrobustcmd*#1{%
    \@ifstar
      {\csuse{\cnltx@stripbs#1@star}}
      {\csuse{\cnltx@stripbs#1@nostar}}%
  }%
  \cnltx@robust@cs{\cnltx@stripbs#1@nostar}[1]{%
    \ifcsdef{\cnltx@stripbs#1@\detokenize{##1}}
      {\csuse{\cnltx@stripbs#1format}{##1}}
      {\csuse{\cnltx@stripbs#1firstformat}{##1}\csuse{define@\cnltx@stripbs#1}{##1}}%
  }%
  \cnltx@robust@cs{\cnltx@stripbs#1@star}[1]{\csuse{\cnltx@stripbs#1starformat}{##1}}%
  \cnltx@new@cs{\cnltx@stripbs#1@used}{}%
  \cnltx@robust@cs{define@\cnltx@stripbs#1}[1]{%
    \csgdef{\cnltx@stripbs#1@\detokenize{##1}}{}%
    \listcsgadd{\cnltx@stripbs#1@used}{##1}%
  }%
  \cnltx@robust@cs{undefine@\cnltx@stripbs#1}[1]{%
    \csundef{\cnltx@stripbs#1@\detokenize{##1}}%
  }%
  \cnltx@robust@cs{reset\cnltx@stripbs#1}{%
    \forlistcsloop{\csuse{undefine@\cnltx@stripbs#1}}{\cnltx@stripbs#1@used}%
    \csdef{\cnltx@stripbs#1@used}{}%
  }%
  \cnltx@new@cs{\cnltx@stripbs#1firstformat}[1]{##1}%
  \cnltx@new@cs{\cnltx@stripbs#1format}[1]{##1}%
  \cnltx@new@cs{\cnltx@stripbs#1starformat}[1]{##1}%
}

% --------------------------------------------------------------------------

\newcommand*\writename[1]{\cnltx@write@name#1 \q@stop}

\newcommand*\cnltx@write@firstname[1]{#1}
\newcommand*\cnltx@write@middlename[1]{\cnltx@initial{#1}}
\newcommand*\cnltx@write@lastname[1]{\textsc{#1}}
\newcommand*\cnltx@between@names{\,}

\newcommand*\cnltx@initial[1]{\cnltx@initial@aux#1\q@stop}
\def\cnltx@initial@aux#1#2\q@stop{#1.}

\newcommand*\cnltx@name@idx[3]{%
  \ifblank{#1}
    {\index{#3@\cnltx@write@lastname{#3}}}
    {\index{#3, #1@\cnltx@write@lastname{#3}, \cnltx@write@firstname{#1}}}%
}

% TODO: Index hinzufügen \newcommand*\cnltx@name@idx[2]{\index{#1@#2}}
\newcommand*\cnltx@write@fullname[2]{%
  \cnltx@write@firstname{#1}\cnltx@between@names
  \cnltx@write@lastname{#2}%
}

\newcommand*\cnltx@write@fullmiddlename[3]{%
  \cnltx@write@firstname{#1}\cnltx@between@names
  \cnltx@write@middlename{#2}\cnltx@between@names
  \cnltx@write@lastname{#3}%
}
\def\cnltx@write@fullmiddlename@aux#1#2#3 \q@stop{%
  \cnltx@write@fullmiddlename{#1}{#2}{#3}%
  \ifbool{cnltx@name@noidx}{}{%
    \cnltx@name@idx{#1}{#2}{#3}%
  }%
}

\def\cnltx@write@name#1 #2\q@stop{%
  \ifblank{#2}
    {%
      \cnltx@write@lastname{#1}%
      \ifbool{cnltx@name@noidx}{}
        {\cnltx@name@idx{}{}{#1}}%
    }
    {\cnltx@write@completename{#1}#2\q@stop}%
}
% TODO: erweitern auf mehrere mittlere Namen:
\def\cnltx@write@completename#1#2 #3\q@stop{%
  \ifblank{#3}
    {%
      \cnltx@write@fullname{#1}{#2}%
      \ifbool{cnltx@name@noidx}{}
        {\cnltx@name@idx{#1}{}{#2}}%
    }
    {\cnltx@write@fullmiddlename@aux{#1}{#2}#3\q@stop}%
}

% name formats:
\newrobustcmd*\defnameformat[4]{%
  \cnltx@def@nameformat{#1}{#2}{#3}{#4}%
}
\newrobustcmd*\cnltx@def@nameformat[4]{%
  \protected\csdef{cnltx@nameformat@#1}{%
    \def\cnltx@write@firstname####1{#2}%
    \def\cnltx@write@middlename####1{#3}%
    \def\cnltx@write@lastname####1{#4}%
  }%
}

\defnameformat{fullname}
  {##1}
  {##1}
  {\textsc{##1}}
\defnameformat{middledot}
  {##1}
  {\cnltx@initial{##1}}
  {\textsc{##1}}
\defnameformat{firstmiddledot}
  {\cnltx@initial{##1}}
  {\cnltx@initial{##1}}
  {\textsc{##1}}
\defnameformat{alldot}
  {\cnltx@initial{##1}}
  {\cnltx@initial{##1}}
  {\cnltx@initial{##1}}
\defnameformat{nomiddle}
  {##1}
  {\@gobble}
  {\textsc{##1}}
\defnameformat{nomiddledot}
  {\cnltx@initial{##1}}
  {\@gobble}
  {\textsc{##1}}
% \show\cnltx@nameformat@nomiddledot
\defnameformat{onlylast}
  {\@gobble}
  {\@gobble}
  {\textsc{##1}}

% choose name format:
\newrobustcmd*\writenameformat[1]{%
  \csuse{cnltx@nameformat@#1}%
}

% --------------------------------------------------------------------------

\newbool{cnltx@name@noidx}

\newfirstformat\name
\renewcommand*\namefirstformat[1]{\writename{#1}}
\renewcommand*\nameformat[1]{{\writenameformat{nomiddle}\writename{#1}}}
\renewcommand*\namestarformat[1]{%
  \begingroup
    \booltrue{cnltx@name@noidx}%
    \namefirstformat{#1}%
  \endgroup
}

\newrobustcmd*\cnltx@newname[2]{%
  \newrobustcmd*#1{%
    \@ifstar
      {\name*{#2}}
      {\name{#2}}%
    }%
}

\newrobustcmd*\newname{\cnltx@newname}

\endinput
% --------------------------------------------------------------------------
