% ********************************************************************
% * Bewertung                                                        *
% ********************************************************************


% Metadaten
% ********************************************************************
\DeclareExerciseProperty{erwartungen}

% ********************************************************************
% Erwartungen                                                        *
% ********************************************************************
% Zur Speicherung der Erwartungen werden die Eigenschaften von xsim
% Aufgaben erweitert. Hierzu ist es erforderlich, dass die Inhalte
% der Umgebung expandiert oder serialisiert (detokenized) werden
% und dem "SetExerciseProperty"-Makro als Wert für den Schlüssel
% "erwartungen" übergeben werden.
% Um den folgenden Quelltext halbwegs lesbar zu halten, wird auf
% das environ-Paket zurückgegriffen und viele Dinge aus LaTeX3 genutzt.

\ExplSyntaxOn

% Nötige Speichermöglichkeiten
% ********************************************************************
\str_new:N \schule_zeilen_erwartungen_str
\str_new:N \schule_aufgaben_erwartungen_str
\int_new:N \schule_aufgaben_punkte_int
\int_new:N \schule_aufgaben_zusatzpunkte_int
\int_new:N \schule_aufgaben_punkte_ges_int
\int_new:N \schule_aufgaben_zusatzpunkte_ges_int
\bool_new:N \schule_erwartungen_zeile_gerade_bool

% Erwartungen-Umgebung
% ********************************************************************
\NewEnviron{erwartungen}{
    \exp_args:Nno\SetExerciseProperty{erwartungen}{\BODY}
}

% Einzelerwartung in Form bringen
\NewDocumentCommand{\erwartung}{m m O{}}{%
    %Zeilenfarbe
    \bool_if:NTF \schule_erwartungen_zeile_gerade_bool {
        \bool_gset_false:N \schule_erwartungen_zeile_gerade_bool
        \tl_gput_right:Nn \schule_zeilen_erwartungen_str {\detokenize{\rowcolor{black!10}}}
    }{
        \bool_gset_true:N \schule_erwartungen_zeile_gerade_bool
        \tl_gput_right:Nn \schule_zeilen_erwartungen_str {\detokenize{\rowcolor{white}}}
    }

    \IfEqCase{\schule@erwartungshorizontStil}{
        {simpel}{
            \tl_gput_right:Nn \schule_zeilen_erwartungen_str {\detokenize{#1 & & & \\ \hline}}
        }%
    }[%
        % Standard oder Einzel
        \int_gadd:Nn \schule_aufgaben_punkte_int {\_str_to_int_with_zero:n{#2}} %Punkte
        \int_gadd:Nn \schule_aufgaben_zusatzpunkte_int {\_str_to_int_with_zero:n{#3}} %Zusatzpunkte

        \tl_gput_right:Nn \schule_zeilen_erwartungen_str {\detokenize{#1 & }}
        \tl_gput_right:Nn \schule_zeilen_erwartungen_str {\_schule_punkte_anzeige:nn {\_str_to_int_with_zero:n{#2}}{\_str_to_int_with_zero:n{#3}}} %Punkte
        \tl_gput_right:Nn \schule_zeilen_erwartungen_str {\detokenize{ & \\ \hline}} %Zeile
    ]
}

% Erwartungshorizont
% ********************************************************************
% Hilfsfunktionen
% --------------------------------------------------------------------
% String in Zahl mit 0 beachten
\cs_new:Npn \_str_to_int_with_zero:n #1 {
    \str_if_eq:nnTF {#1} {} {0} {#1}
}

% Anzeige für Punkte
\cs_new:Npn \_schule_punkte_anzeige:nn #1 #2 {
    \int_compare:nT {#1 > 0}{#1}
    \int_compare:nT {#2 > 0}{\space +#2}
}

\cs_new:Npn \_schule_erwartungen_punkte_speichern {
    %Punkte speichern, wenn > 0
    \int_compare:nT {\schule_aufgaben_punkte_int > 0}{\exp_args:Nnx\SetExerciseProperty{points}{\int_use:N \schule_aufgaben_punkte_int}}
    \int_compare:nT {\schule_aufgaben_zusatzpunkte_int > 0}{\exp_args:Nnx\SetExerciseProperty{bonus-points}{\int_use:N \schule_aufgaben_zusatzpunkte_int}}
}

% Zeile für die Aufgabe in der Tabelle setzen (Standard).
\cs_new:Npn \_schule_aufgaben_erwartungen_zeile {
    \detokenize{\specialrule{.05em}{0em}{0em}}%
    \detokenize{\rowcolor{black!20}\bfseries}
    \GetExerciseName\space\GetExerciseProperty{counter}
    \detokenize{& \bfseries}%
    \_schule_punkte_anzeige:nn {\int_use:N \schule_aufgaben_punkte_int}{\int_use:N \schule_aufgaben_zusatzpunkte_int}
    \detokenize{& \\}%
    \detokenize{\specialrule{.1em}{0em}{0em}}
}

% Zeile für die Aufgabe in der Tabelle setzen (Simple).
\cs_new:Npn \_schule_aufgaben_erwartungen_zeile_simple {
    \detokenize{\specialrule{.05em}{0em}{0em}}%
    \detokenize{\rowcolor{black!20}\bfseries}
    \GetExerciseName\space\GetExerciseProperty{counter}
    \detokenize{& \usym{1F642} & \usym{1F610} & \usym{1F641} \\}%
    \detokenize{\specialrule{.1em}{0em}{0em}}
}

% Erwartungshorizont (Eine Tabelle pro Aufgabe)
% --------------------------------------------------------------------
\newcommand{\schule@erwartungshorizontEinzeltabellen}{
    %Aufgabenausgabe leeren
    \str_gclear:N \schule_aufgaben_erwartungen_str

    \ForEachUsedExerciseByID{%
        %Variablen für neue Aufgabe neu initialisieren
        \str_gclear:N \schule_zeilen_erwartungen_str
        \int_gzero:N \schule_aufgaben_punkte_int
        \int_gzero:N \schule_aufgaben_zusatzpunkte_int
        \bool_gset_false:N \schule_erwartungen_zeile_gerade_bool

        %Definition der Aufgabe in entsprechende Befehle laden
        \def\ExerciseType{##1}%
        \def\ExerciseID{##2}%
        \GetExercisePropertyTF{erwartungen}{\PropertyValue}{}

        %Punkte setzen
        \_schule_erwartungen_punkte_speichern

        %Zusammengebautetes wieder serialisieren
        \tokenize{%
            \schule@aEHCode%
        }{%
            \schule_zeilen_erwartungen_str
        }

        % Überschrift
        \subsection*{\GetExerciseName\space##3}
        \vspace*{-1ex}
        % Tabelle setzen
        \begin{longtable}{|p{.65\linewidth}|r|r|}\hline
            % Kopfzeile
            \rowcolor{black!20}
            \textbf{Die Schülerin/der Schüler\dots} &
            \textbf{max. Punkte} &
            \textbf{erreicht}%   %%
            \tabularnewline\specialrule{.1em}{0em}{0em}  %
            % Erwartungen
            \schule@aEHCode%
            % Fusszeile
            \specialrule{.05em}{0em}{0em}
            \rowcolor{black!20}
            \textbf{Gesamt} &
            \textbf{\_schule_punkte_anzeige:nn {\int_use:N \schule_aufgaben_punkte_int}{\int_use:N \schule_aufgaben_zusatzpunkte_int}} &
            \tabularnewline\hline
        \end{longtable}
    }

    \subsection*{Gesamt}
    \punktuebersicht

    \section*{Notenverteilung}
    \notenverteilung

    \clearpage
}

% Erwartungshorizont (Eine Tabelle für alles)
% --------------------------------------------------------------------
\newcommand{\schule@erwartungshorizontStandard}{
    %Aufgabenausgabe leeren
    \str_gclear:N \schule_aufgaben_erwartungen_str
    \int_gzero:N \schule_aufgaben_punkte_ges_int
    \int_gzero:N \schule_aufgaben_zusatzpunkte_ges_int

    \ForEachUsedExerciseByID{%
        %Variablen für neue Aufgabe neu initialisieren
        \str_gclear:N \schule_zeilen_erwartungen_str
        \int_gzero:N \schule_aufgaben_punkte_int
        \int_gzero:N \schule_aufgaben_zusatzpunkte_int
        \bool_gset_false:N \schule_erwartungen_zeile_gerade_bool

        %Definition der Aufgabe in entsprechende Befehle laden
        \def\ExerciseType{##1}%
        \def\ExerciseID{##2}%
        \GetExercisePropertyTF{erwartungen}{\PropertyValue}{}

        %Gesamtaufgabe
        \tl_gput_right:Nx \schule_aufgaben_erwartungen_str \_schule_aufgaben_erwartungen_zeile

        \int_gadd:Nn \schule_aufgaben_punkte_ges_int {\schule_aufgaben_punkte_int} %Punkte
        \int_gadd:Nn \schule_aufgaben_zusatzpunkte_ges_int {\schule_aufgaben_zusatzpunkte_int} %Zusatzpunkte

        \_schule_erwartungen_punkte_speichern

        %Zusammenbauen
        \str_gconcat:NNN \schule_aufgaben_erwartungen_str \schule_aufgaben_erwartungen_str \schule_zeilen_erwartungen_str
    }

    %Zusammengebautetes wieder serialisieren
    \tokenize{%
        \schule@aEHCode%
    }{%
        \schule_aufgaben_erwartungen_str
    }

    \begin{longtable}{|p{.65\linewidth}|r|r|}\hline
        % Kopfzeile
        \rowcolor{black!20}
        \textbf{Die~Schülerin/der~Schüler\dots} & \textbf{max.~Punkte} & \textbf{erreicht}%
        \tabularnewline\specialrule{.1em}{0em}{0em}  %
        % Erwartungen
        \schule@aEHCode%

        % Fusszeile
        \specialrule{.05em}{0em}{0em}
        \rowcolor{black!20}
        \textbf{Gesamt} &
        \textbf{\_schule_punkte_anzeige:nn {\int_use:N \schule_aufgaben_punkte_ges_int}{\int_use:N \schule_aufgaben_zusatzpunkte_ges_int}} &
        \tabularnewline\hline
    \end{longtable}

    \section*{Notenverteilung}
    \notenverteilung

    \clearpage
}

% Erwartungshorizont (Eine Tabelle für alles, keine Punkte, Smilies)
% --------------------------------------------------------------------
\newcommand{\schule@erwartungshorizontSimpel}{
    %Aufgabenausgabe leeren
    \str_gclear:N \schule_aufgaben_erwartungen_str

    \ForEachUsedExerciseByID{%
        %Variablen für neue Aufgabe neu initialisieren
        \str_gclear:N \schule_zeilen_erwartungen_str
        \bool_gset_false:N \schule_erwartungen_zeile_gerade_bool

        %Definition der Aufgabe in entsprechende Befehle laden
        \def\ExerciseType{##1}%
        \def\ExerciseID{##2}%
        \GetExercisePropertyTF{erwartungen}{\PropertyValue}{}

        %Gesamtaufgabe
        \tl_gput_right:Nx \schule_aufgaben_erwartungen_str \_schule_aufgaben_erwartungen_zeile_simple

        %Zusammenbauen
        \str_gconcat:NNN \schule_aufgaben_erwartungen_str \schule_aufgaben_erwartungen_str \schule_zeilen_erwartungen_str
    }

    %Zusammengebautetes wieder serialisieren
    \tokenize{%
        \schule@aEHCode%
    }{%
        \schule_aufgaben_erwartungen_str
    }

		\ifthenelse{\boolean{schule@erwartungshorizontKeineSeiten}}{%
			\cfoot{}
		}{}%
    \begin{longtable}{|p{.8\linewidth}|c|c|c|}\hline
        % Erwartungen
        \schule@aEHCode%
    \end{longtable}

    \clearpage
}

% Erwartungshorizont abhängig vom gewählten Stil setzen.
% Zur Zeit nur teilweise möglich
\newcommand{\erwartungshorizont}{
        % Stil
        \IfEqCase{\schule@erwartungshorizontStil}{
            % Einzeltabellen
            {einzeltabellen}{
                \schule@erwartungshorizontEinzeltabellen
            }%
            % Ohne Punkte, mit Smilies
            {simpel}{
                \schule@erwartungshorizontSimpel
            }%
        }[%
            % Standard => Alles in eine Tabelle
            \schule@erwartungshorizontStandard
        ]
}

% Erwartungshorizont anzeigen?
% --------------------------------------------------------------------
\ifthenelse{\boolean{schule@erwartungshorizontAnzeigen}}{%
    \ifthenelse{\equal{\schule@erwartungshorizontStil}{genord-punkte}}{%
        \AtBeginDocument{%
            \DTLloaddb[]{namen}{\schule@erwartungshorizontPunkteDatei}	%
        }%
    }{}
    \AtEndDocument{%
        \clearpage
        % ggf. Seitenzahlenreset
        \ifthenelse{\boolean{schule@ende@inhalt@gesetzt}}{}{%
            \pagenumbering{Roman}%
            \setboolean{schule@ende@inhalt@gesetzt}{true}%
        }
        \cfoot{\thepage}
        \ohead{Erwartungshorizont\schule@kopfUmbruch}

        \section*{Erwartungshorizont}
        \erwartungshorizont
        %Neue Werte eintragen
        \xsim_update_list:n {points}
        \xsim_update_list:n {bonus-points}
    }
}{%
}

\ExplSyntaxOff

% Notenverteilung
% ********************************************************************
% Zuordnung von Noten zu Punkten

\newcommand{\schule@punkteZuNote}[1]{\GetGradeRequirementForGoal{#1}{points}{}{}}

\newcommand{\schule@notenschemaSetzen}[1]{
    \expandafter\DeclareGradeDistribution\expandafter{#1}
}

\schule@notenschemaSetzen{\schule@notenschema}

% Notenverteilung anzeigen
% --------------------------------------------------------------------
\newcommand{\notenverteilung}{
		\ifthenelse{\boolean{schule@erwartungshorizontKeineSeiten}}{%
			\cfoot{}
		}{}%
    \ifthenelse{\boolean{schule@kmkPunkte}}{
    % Mit KMK-Notenpunkten
    % ----------------------------------------------------------------
        \parbox{.24\linewidth}{
            \tiny
            \begin{tabular}{|p{0.55ex}p{0.5\linewidth}|r|r|}\hline
                \rowcolor{black!20}
                \multicolumn{2}{|l|}{\textbf{Notenpunkte}}  &
                \textbf{$\ge$ P.}
                \\\hline
                \textbf{15} & (sehr gut\,$+$)  & $\schule@punkteZuNote{15}$
                \\\hline
                \rowcolor{black!10}
                \textbf{14} & (sehr gut)  & $\schule@punkteZuNote{14}$
                \\\hline
                \textbf{13} & (sehr gut\,$-$)  &$\schule@punkteZuNote{13}$
                \\\hline
                \rowcolor{black!10}
                \textbf{12} & (gut\,$+$)  & $\schule@punkteZuNote{12}$
                \\\hline
            \end{tabular}
        }
        \parbox{.24\linewidth}{
            \tiny
            \begin{tabular}{|p{0.55ex}p{0.5\linewidth}|r|r|}\hline
                \rowcolor{black!20}
                \multicolumn{2}{|l|}{\textbf{Notenpunkte}}  &
                \textbf{$\ge$ P.}
                \\\hline
                \textbf{11} & (gut) & $\schule@punkteZuNote{11}$
                \\\hline
                \rowcolor{black!10}
                \textbf{10} & (gut\,$-$)  & $\schule@punkteZuNote{10}$
                \\\hline
                \textbf{9} & (befriedigend\,$+$) &$\schule@punkteZuNote{9}$
                \\\hline
                \rowcolor{black!10}
                \textbf{8} & (befriedigend)  & $\schule@punkteZuNote{8}$
                \\\hline
            \end{tabular}
        }
        \parbox{.24\linewidth}{
            \tiny
            \begin{tabular}{|p{0.55ex}p{0.5\linewidth}|r|r|}\hline
                \rowcolor{black!20}
                \multicolumn{2}{|l|}{\textbf{Notenpunkte}}  &
                \textbf{$\ge$ P.}
                \\\hline
                \textbf{7} & (befriedigend$-$)  & $\schule@punkteZuNote{7}$
                \\\hline
                \rowcolor{black!10}
                \textbf{6} & (ausreichend\,$+$)  & $\schule@punkteZuNote{6}$
                \\\hline
                \textbf{5} & (ausreichend) & $\schule@punkteZuNote{5}$
                \\\hline
                \rowcolor{black!10}
                \textbf{4} & (ausreichend\,$-$) & $\schule@punkteZuNote{4}$
                \\\hline
            \end{tabular}
        }
        \parbox{.24\linewidth}{
            \tiny
            \begin{tabular}{|p{0.55ex}p{0.5\linewidth}|r|r|}\hline
                \rowcolor{black!20}
                \multicolumn{2}{|l|}{\textbf{Notenpunkte}}  &
                \textbf{$\ge$ P.}
                \\\hline
                \textbf{3} & (mangelhaft\,$+$) & $\schule@punkteZuNote{3}$
                \\\hline
                \rowcolor{black!10}
                \textbf{2} & (mangelhaft)  & $\schule@punkteZuNote{2}$
                \\\hline
                \textbf{1} & (mangelhaft\,$-$) & $\schule@punkteZuNote{1}$
                \\\hline
                \rowcolor{black!10}
                \textbf{0} & (ungenügend) & $0$ \\\hline
            \end{tabular}
        }
    }{
    % Ohne Notenpunkte
    % ----------------------------------------------------------------
        \parbox{.24\linewidth}{
            \tiny
            \begin{tabular}{|p{0.6\linewidth}|r|r|}\hline
                \rowcolor{black!20}\textbf{Note}  &
                \textbf{$\ge$ P.}
                \\\hline
                sehr gut plus  & $\schule@punkteZuNote{15}$\\\hline
                \rowcolor{black!10}
                sehr gut  & $\schule@punkteZuNote{14}$\\\hline
                sehr gut minus  & $\schule@punkteZuNote{13}$\\\hline
                \rowcolor{black!10}
                gut plus  & $\schule@punkteZuNote{12}$\\\hline
            \end{tabular}
        }
        \parbox{.24\linewidth}{
            \tiny
            \begin{tabular}{|p{0.6\linewidth}|r|r|}\hline
                \rowcolor{black!20}\textbf{Note}  &
                \textbf{$\ge$ P.}
                \\\hline
                gut & $\schule@punkteZuNote{11}$\\\hline
                \rowcolor{black!10}
                gut minus  & $\schule@punkteZuNote{10}$ \\\hline
                befriedigend plus & $\schule@punkteZuNote{9}$\\\hline
                \rowcolor{black!10}
                befriedigend  & $\schule@punkteZuNote{8}$\\\hline
            \end{tabular}
        }
        \parbox{.24\linewidth}{
            \tiny
            \begin{tabular}{|p{0.6\linewidth}|r|r|}\hline
                \rowcolor{black!20}\textbf{Note}  &
                \textbf{$\ge$ P.}
                \\\hline
                befriedigend minus  & $\schule@punkteZuNote{7}$\\\hline
                \rowcolor{black!10}
                ausreichend plus  & $\schule@punkteZuNote{6}$\\\hline
                ausreichend & $\schule@punkteZuNote{5}$\\\hline
                \rowcolor{black!10}
                ausreichend minus & $\schule@punkteZuNote{4}$\\\hline
            \end{tabular}
        }
        \parbox{.24\linewidth}{
            \tiny
            \begin{tabular}{|p{0.6\linewidth}|r|r|}\hline
                \rowcolor{black!20}\textbf{Note}  &
                \textbf{$\ge$ P.}
                \\\hline
                mangelhaft plus & $\schule@punkteZuNote{3}$\\\hline
                \rowcolor{black!10}
                mangelhaft  & $\schule@punkteZuNote{2}$\\\hline
                mangelhaft minus & $\schule@punkteZuNote{1}$\\\hline
                \rowcolor{black!10}
                ungenügend & $0$ \\\hline
            \end{tabular}
        }
    }
}
