%%%==============================================================================
%% Copyright 2022-23 by Alceu Frigeri
%%
%% This work may be distributed and/or modified under the conditions of
%%
%% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
%%   version 1.3c (or later), and/or
%% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html),
%%   version 3 (or later)
%%
%% This work has the LPPL maintenance status *maintained*.
%%
%% The Current Maintainer of this work is Alceu Frigeri
%%
%% This is version 1.0.8 (2023/01/28)
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/ufrgscca
%%
%%%==============================================================================
%% UFRGS stands for "Federal University of Rio Grande do Sul" in south Brazil
%% EE    stands for "Engineering School"
%% CCA   stands for "Control and Automation Engineering Course" (Portuguese acronym)
%%%==============================================================================
\NeedsTeXFormat{LaTeX2e}[2022/06/01]
\def\tc@tmp@packname{ufrgscca-gen}
\def\tc@tmp@altpackname{ufrgsccagen}
\def\tc@tmp@packdesc{UFRGS/CCA generic/miscellany commands}
\def\tc@tmp@packdate{2023/01/28}
\def\tc@tmp@packversion{1.0.8}
\let\@exp\expandafter
\@exp\edef\csname\tc@tmp@altpackname version\endcsname{\tc@tmp@packversion}
\@exp\@exp\@exp\ProvidesPackage\@exp\@exp\@exp{\@exp\tc@tmp@packname\@exp}\@exp[\tc@tmp@packdate\space v\tc@tmp@packversion\space\tc@tmp@packdesc]

\def\tcgen@fam{tcdef}
\def\tcgen@factgrp{gen}%
%

\DeclareKeys[ufrgscca-gen]{
    family.usage = load,
	family.store = \tcgen@fam,

    group.usage = load,
	group.store = \tcgen@factgrp,
}
\ProcessKeyOptions[ufrgscca-gen]\relax



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
% \tcgen@cdef[fam]{#1}{#2} => \gdef\<fam>@#1{#2}%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\NewDocumentCommand{\tcgen@cdef}{O{\tcgen@fam}D<>{\tcgen@factgrp} m +m}{%
    \expandafter\gdef\csname #1@#2@#3\endcsname{#4}%
}%
%
\NewDocumentCommand{\factory}{O{\tcgen@fam}D<>{\tcgen@factgrp}m}{%
				\expandafter\long\expandafter\xdef\csname #3\endcsname##1{\noexpand\tcgen@cdef[#1]<#2>{#3}{##1}}%
				%\csname #3\endcsname{-default-}
				\expandafter\def\csname #3.fam\endcsname{#1}%
				\@ifundefined{#3undef}{}{\expandafter\gdef\csname tc@factdup@#3\endcsname{}}
         \expandafter\def\csname #3undef\endcsname{\expandafter\let\csname #1@#2@#3\endcsname\undefined}%
}%
\NewDocumentCommand{\cmdfactory}{O{\tcgen@fam}D<>{\tcgen@factgrp}m}{%
		\forcsvlist{\factory[#1]<#2>}{#3}%
		\ifcsundef{tc@factgrplist@#2}{%
		    \ifcsundef{tc@factgrplist}{\csgdef{tc@factgrplist}{#2}}{\csgappto{tc@factgrplist}{,#2}}%
		    \csgdef{tc@factgrplist@#2}{#3}%
		}{\csgappto{tc@factgrplist@#2}{,#3}}%
}%
%
%
% 'debug' auxiliary commands (mainly to find out dups, defined/undefined ones)
%
%
\NewDocumentCommand{\tcgen@factcmd@prt}{m}{\@ifundefined{tc@factdup@#1}{#1}{#1 (dup)}
\expandafter\@ifundefined\expandafter{\csname #1.fam\endcsname @#1}{\textbf{ NOT Defined} \\}{ {\csname\csname #1.fam\endcsname @#1\endcsname} \\}}
\NewDocumentCommand{\tcgen@factcmd@def}{m}{\csname #1.fam\endcsname @\@ifundefined{tc@factdup@#1}{#1}{#1 (dup)} %
	\expandafter\@ifundefined\expandafter{\csname #1.fam\endcsname @#1}{\textbf{ NOT Defined} \\}{ {\slshape Defined} \\} }
%\NewDocumentCommand{\tcgen@factcmd@prt}{m}{{#1}  \\}
%\NewDocumentCommand{\tcgen@factcmd@def}{m}{{#1} :: \@ifundefined{tc@#1}{-- \textbf{NOT Defined} --\\}{Defined \\} }
\NewDocumentCommand{\tcgen@factgrp@prt}{m}{\tightul{#1}  \\%
    		\expandafter\expandafter\expandafter\forcsvlist\expandafter\expandafter\expandafter\tcgen@do\expandafter\expandafter\expandafter{\csname tc@factgrplist@#1\endcsname}%
}
\NewDocumentCommand{\listfactorycmds}{sO{}}{%
    \IfBooleanTF{#1}{\def\tcgen@do##1{\tcgen@factcmd@def{##1}}}{\def\tcgen@do##1{\tcgen@factcmd@prt{##1}}}
    \ifblank{#2}{%
		    \ifcsundef{tc@factgrplist}{Factories Groups: \textbf{empty list}\\ }{%
				     Factories:  \\ %
				    \expandafter\expandafter\expandafter\forcsvlist\expandafter\expandafter\expandafter\tcgen@factgrp@prt\expandafter\expandafter\expandafter{\csname tc@factgrplist\endcsname}%
						%
				}
		}{%
		}%
}


%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%
%
%  \mkswitch creates a switch (somewhat 'like' a programming switch)
%    a 'default case' is associated with the switch when creating it
%    one can add many 'cases' later on.
%    one can have any code associated with a 'switch/case'
%
%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%


\NewDocumentCommand\mkswitch{O{}m}{%
    \NewDocumentCommand{#2}{m}{%
        \ifcsname\string#2@case@##1\endcsname\csname\string#2@case@##1\endcsname\else#1\fi%
    }%
}%
\NewDocumentCommand{\addcase}{mmm}{\expandafter\def\csname\string#1@case@#2\endcsname{#3}}%
\let\addswitchcase\addcase

