% Copyright 2018-2020 by Romano Giannetti
% Copyright 2015-2020 by Stefan Lindner
% Copyright 2013-2020 by Stefan Erhardt
% Copyright 2007-2020 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the files gpl-3.0_license.txt and lppl-1-3c_license.txt for more details.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% flow handling

%% styles
\ctikzset{bipole flow style/.style={}}
\tikzset{bipole flow style/.code={
        \ctikzset{bipole flow style/.style={#1}}
}}
\tikzset{bipole flow append style/.code={
        \ctikzset{bipole flow style/.append style={#1}}
}}

%% Options
\ctikzset{f^>/.style = {
        f = #1,
        \circuitikzbasekey/bipole/flow/direction = forward,
        \circuitikzbasekey/bipole/flow/x position = after,
        \circuitikzbasekey/bipole/curflowrent/y position = above
    }
}

\ctikzset{f_>/.style = {
        f = #1,
        \circuitikzbasekey/bipole/flow/direction = forward,
        \circuitikzbasekey/bipole/flow/x position = after,
        \circuitikzbasekey/bipole/flow/y position = below
    }
}

\ctikzset{f>^/.style = {
        f = #1,
        \circuitikzbasekey/bipole/flow/direction = forward,
        \circuitikzbasekey/bipole/flow/x position = before,
        \circuitikzbasekey/bipole/flow/y position = above
    }
}

\ctikzset{f>_/.style = {
        f = #1,
        \circuitikzbasekey/bipole/flow/direction = forward,
        \circuitikzbasekey/bipole/flow/x position = before,
        \circuitikzbasekey/bipole/flow/y position = below
    }
}

\ctikzset{f^</.style = {
        f = #1,
        \circuitikzbasekey/bipole/flow/direction = backward,
        \circuitikzbasekey/bipole/flow/x position = after,
        \circuitikzbasekey/bipole/flow/y position = above
    }
}

\ctikzset{f_</.style = {
        f = #1,
        \circuitikzbasekey/bipole/flow/direction = backward,
        \circuitikzbasekey/bipole/flow/x position = after,
        \circuitikzbasekey/bipole/flow/y position = below
    }
}

\ctikzset{f<^/.style = {
        f = #1,
        \circuitikzbasekey/bipole/flow/direction = backward,
        \circuitikzbasekey/bipole/flow/x position = before,
        \circuitikzbasekey/bipole/flow/y position = above
    }
}

\ctikzset{f<_/.style = {
        f = #1,
        \circuitikzbasekey/bipole/flow/direction = backward,
        \circuitikzbasekey/bipole/flow/x position = before,
        \circuitikzbasekey/bipole/flow/y position = below
    }
}

\ctikzset{f</.style = { f = #1, \circuitikzbasekey/bipole/flow/direction = backward} }
\ctikzset{f_/.style = { f = #1, \circuitikzbasekey/bipole/flow/y position = below } }
\ctikzset{f>/.style = { f = #1, \circuitikzbasekey/bipole/flow/direction = forward } }
\ctikzset{f^/.style = { f = #1, \circuitikzbasekey/bipole/flow/y position = above } }

\ctikzset{f/.code = {
        \pgfkeys{\circuitikzbasekey/bipole/flow/direction = forward,
            \circuitikzbasekey/bipole/flow/x position = after,
        \circuitikzbasekey/bipole/flow/y position = above }
        \pgfkeys{/tikz/circuitikz/bipole/flow/label/name=#1}
        \ctikzsetvalof{bipole/flow/label/unit}{}
        \ifpgf@circ@siunitx
            \pgf@circ@handleSI{#1}
            \ifpgf@circ@siunitx@res
                \edef\pgf@temp{\pgf@circ@handleSI@val}
                \pgfkeyslet{/tikz/circuitikz/bipole/flow/label/name}{\pgf@temp}
                \edef\pgf@temp{\pgf@circ@handleSI@unit}
                \pgfkeyslet{/tikz/circuitikz/bipole/flow/label/unit}{\pgf@temp}
            \else
        \fi
        \else
    \fi
}
}

%% Output routine
\def\pgf@circ@drawflow{
    \pgfextra{
        \edef\pgf@circ@ffffff{\pgf@circ@direction}
        \def\pgfcircmathresult{\expandafter\pgf@circ@stripdecimals\pgf@circ@ffffff\pgf@nil}

        \ifnum\pgfcircmathresult >4 \ifnum\pgfcircmathresult <86
                \ifpgf@circuit@bipole@flow@below
                        \def\pgf@circ@dir{north west} \else \def\pgf@circ@dir{south east}
                \fi
        \fi\fi
        \ifnum\pgfcircmathresult >85 \ifnum\pgfcircmathresult <95
                \ifpgf@circuit@bipole@flow@below
                        \def\pgf@circ@dir{west} \else \def\pgf@circ@dir{east}
                \fi
        \fi\fi
        \ifnum\pgfcircmathresult >94 \ifnum\pgfcircmathresult <176
                \ifpgf@circuit@bipole@flow@below
                         \def\pgf@circ@dir{south west}\else \def\pgf@circ@dir{north east}
                \fi
        \fi\fi
        \ifnum\pgfcircmathresult >175 \ifnum\pgfcircmathresult <185
                \ifpgf@circuit@bipole@flow@below
                          \def\pgf@circ@dir{south}\else\def\pgf@circ@dir{north}
                \fi
        \fi\fi
        \ifnum\pgfcircmathresult >184 \ifnum\pgfcircmathresult <266
                \ifpgf@circuit@bipole@flow@below
                         \def\pgf@circ@dir{south east}\else\def\pgf@circ@dir{north west}
                \fi
        \fi\fi
        \ifnum\pgfcircmathresult >265 \ifnum\pgfcircmathresult <275
                \ifpgf@circuit@bipole@flow@below
                         \def\pgf@circ@dir{east}\else \def\pgf@circ@dir{west}
                \fi
        \fi\fi
        \ifnum\pgfcircmathresult >274 \ifnum\pgfcircmathresult <356
                \ifpgf@circuit@bipole@flow@below
                          \def\pgf@circ@dir{north east}\else\def\pgf@circ@dir{south west}
                \fi
        \fi\fi
        \ifnum\pgfcircmathresult <5
                \ifpgf@circuit@bipole@flow@below
                         \def\pgf@circ@dir{north}\else\def\pgf@circ@dir{south}
                \fi
        \fi
        \ifnum\pgfcircmathresult >355
                \ifpgf@circuit@bipole@flow@below
                         \def\pgf@circ@dir{north}\else\def\pgf@circ@dir{south}
                \fi
        \fi

        \ifpgf@circuit@bipole@flow@below
                \def\pgf@circ@bipole@flow@label@where{-90}
        \else
                \def\pgf@circ@bipole@flow@label@where{+90}
        \fi
    }

    \pgfextra{\def\pgf@temp{short}\edef\pgf@circ@temp{\ctikzvalof{bipole/kind}}}
    \ifx\pgf@circ@temp\pgf@temp%draw flow at a short at middle of the line
        (\tikztostart)--(\tikztotarget)
    \else% normal bipole or source
        \ifpgf@circuit@bipole@flow@before
            (\tikztostart)--(anchorstartnode)
        \else
            (anchorendnode)--(\tikztotarget)
        \fi
    \fi
    \pgfextra{
        \ifpgf@circuit@bipole@flow@backward
            \ifpgf@circuit@bipole@flow@below
                \def\flow@offset{\ctikzvalof{flow/offset}\pgf@circ@Rlen}
            \else
                \def\flow@offset{-\ctikzvalof{flow/offset}\pgf@circ@Rlen}
            \fi
            \pgfmathsubtract{\pgf@circ@ffffff}{180}
            \edef\pgf@circ@ffffff{\expandafter\pgf@circ@stripdecimals\pgfmathresult\pgf@nil}
            \else
            \ifpgf@circuit@bipole@flow@below
                \def\flow@offset{-\ctikzvalof{flow/offset}\pgf@circ@Rlen}
            \else
                \def\flow@offset{\ctikzvalof{flow/offset}\pgf@circ@Rlen}
            \fi
        \fi
    }
    coordinate[flowarrow,pos=\ctikzvalof{flow/distance},rotate=\pgf@circ@ffffff,yshift=\flow@offset, anchor=center](Farrowpos)
    (Farrowpos.\pgf@circ@bipole@flow@label@where) node[anchor=\pgf@circ@dir, \circuitikzbasekey/bipole flow style]
    (\ctikzvalof{bipole/name}flow){\pgf@circ@finallabels{flow/label}}
}

\endinput
