%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This is the TikZ-shields package
% A package to draw badges in the style of shields.io with tikz
% Maintained by thomas-saigre
%
% Project repository and bug tracker:
% https://github.com/thomas-saigre/tikz-shields
%
% Released under the GNU GENERAL PUBLIC LICENSE v3
% See https://github.com/thomas-saigre/tikz-shields/blob/main/LICENSE
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ProvidesPackage{tikz-shields}[2025/05/12 version v0.1 Drawing badges with TikZ]

\@ifpackageloaded{tikz}{}{\RequirePackage{tikz}}
\@ifpackageloaded{hyperref}{}{\RequirePackage{hyperref}}
\@ifpackageloaded{tcolorbox}{}{\RequirePackage{tcolorbox}}
\tcbuselibrary{skins}
\@ifpackageloaded{xkeyval}{}{\RequirePackage{xkeyval}}
\@ifpackageloaded{ifthen}{}{\RequirePackage{ifthen}}


\DeclareOptionX{font}[\sf]{\def\shield@default@font{#1}}
\DeclareOptionX{labelColor}[default-left]{\def\shield@default@labelColor{#1}}
\DeclareOptionX{color}[default-blue]{\def\shield@default@color{#1}}
\DeclareOptionX{colorLeft}[white]{\def\shield@default@colorLeft{#1}}
\DeclareOptionX{colorRight}[white]{\def\shield@default@colorRight{#1}}
\DeclareOptionX{logoColor}[white]{\def\shield@default@logoColor{#1}}
\DeclareOptionX{style}[flat]{%
    \def\shield@tmp@style{#1}%
    \def\shield@default@style{wrong}
    \def\shield@default@error{wrong}
    \@for\shield@opt:=flat,flat-square,plastic,for-the-badge,social\do{%
        \ifx\shield@tmp@style\shield@opt
            \def\shield@default@style{#1}%
        \fi
    }%
    \ifx\shield@default@style\shield@default@error
        \PackageError{tikz-shields}{Invalid style option '#1'}{Valid options are: flat, flatsquare, plastic, for-the-badge, social.}
    \fi
}
\DeclareOptionX{fa}[1]{\def\shield@default@fa{#1}}

\definecolor{default-blue}{HTML}{1283c4}
\definecolor{default-left}{HTML}{5e5e5e}
\definecolor{default-grey}{HTML}{565656}
\definecolor{default-green}{HTML}{77d810}
\definecolor{default-social-frame}{HTML}{d5d5d5}
\definecolor{default-social-top}{HTML}{fcfcfc}
\definecolor{default-social-bottom}{HTML}{e5e5e5}

\ExecuteOptionsX{font}
\ExecuteOptionsX{labelColor}
\ExecuteOptionsX{color}
\ExecuteOptionsX{colorLeft}
\ExecuteOptionsX{colorRight}
\ExecuteOptionsX{logoColor}
\ExecuteOptionsX{style}
\ExecuteOptionsX{fa}

\define@key{badge}{labelColor}{\def\badge@labelColor{#1}}
\define@key{badge}{color}{\def\badge@color{#1}}
\define@key{badge}{colorLeft}{\def\badge@colorLeft{#1}}
\define@key{badge}{colorRight}{\def\badge@colorRight{#1}}
\define@key{badge}{logo}{\def\badge@logo{#1}}
\define@key{badge}{logoColor}{\def\badge@logoColor{#1}}
\define@key{badge}{link}{\def\badge@link{#1}}
\define@boolkey{badge}{showlink}{\def\badge@showlink{#1}}
\define@choicekey{badge}{style}{flat,flat-square,plastic,for-the-badge,social}{\def\badge@style{#1}}
\define@key{badge}{baseline}{\def\badge@baseline{#1}}
\define@key{badge}{font}{\def\badge@font{#1}}

\ProcessOptionsX

\ifnum\shield@default@fa=1\relax
    \@ifpackageloaded{fontawesome}{}{\RequirePackage{fontawesome}}
\fi
\ifnum\shield@default@fa=5\relax
    \@ifpackageloaded{fontawesome5}{}{\RequirePackage{fontawesome5}}
\fi
\ifnum\shield@default@fa=6\relax
    \@ifpackageloaded{fontawesome6}{}{\RequirePackage{fontawesome6}}
\fi
\ifnum\shield@default@fa=7\relax
    \@ifpackageloaded{fontawesome7}{}{\RequirePackage{fontawesome7}}
\fi

\newtcbox{\socialleft}{
  enhanced,
  nobeforeafter,
  tcbox raise base,
  boxrule=1pt,
  top=0pt, left=0pt, right=0pt, bottom=0pt,
  colframe=default-social-frame,
  coltext=black,
  interior style={top color=default-social-top, bottom color=default-social-bottom},
  overlay={}
}

\newtcbox{\socialright}{
  enhanced,
  nobeforeafter,
  tcbox raise base,
  boxrule=0pt,
  top=0pt, left=0pt, right=0pt, bottom=0pt,
  colframe=default-social-frame,
  coltext=black,
  interior style={top color=default-social-top, bottom color=default-social-bottom},
  overlay unbroken and first={
    \shade[top color=default-social-top, bottom color=default-social-bottom]
      ([xshift=0pt, yshift=3pt]frame.west) --
      ([xshift=-3pt,yshift=0pt]frame.west) --
      ([xshift=0pt, yshift=-3pt]frame.west) -- cycle;
    \draw[color=default-social-frame, line width=1pt]
        ([xshift=0pt, yshift=3pt]frame.west) --
        ([xshift=-3pt,yshift=0pt]frame.west) --
        ([xshift=0pt, yshift=-3pt]frame.west) [rounded corners] --
        (frame.south west) --
        (frame.south east) --
        (frame.north east) --
        (frame.north west) [sharp corners] --
        cycle;
    },
}


% Creation of a text with dropped shadow
% #1 Color of background
% #2 Color of the text
% #3 Text
\newcommand{\droptextshadow}[3]{%
    \tikz[baseline,outer sep=0pt, inner sep=0pt]{
    % Dropped Shadow
    \node[#1!40!black] at (0,-0.1ex) {#3};
    % Text
    \node[#2] at (0,0) {#3};
    }%
}

% Creation of a text without dropped shadow
% #1 Color of the text
% #2 Text
\newcommand{\droptextnoshadow}[2]{%
    \tikz[baseline,outer sep=0pt, inner sep=0pt]{
    % Text
    \node[#1] at (0,0) {#2};
    }%
}

% Draw a badge
% #1 Default options
% #2 Left text
% #3 Right text
\newcommand{\drawBadgeAux}[3][]{%
    \def\badge@labelColor{\shield@default@labelColor}%
    \def\badge@color{\shield@default@color}%
    \def\badge@colorLeft{\shield@default@colorLeft}%
    \def\badge@colorRight{\shield@default@colorRight}%
    \def\badge@logo{}%
    \def\badge@logoColor{\shield@default@logoColor}%
    \def\badge@style{\shield@default@style}%
    \def\badge@baseline{0mm}%
    \def\badge@font{\shield@default@font}%
    %
    \setkeys{badge}{#1}%
    %
    \ifthenelse{\equal{\badge@style}{social}}{%
        % social badge : special handling
        \badge@font%
        \mbox{\socialleft{#2\vphantom{#3}}\hspace{1ex}\socialright{#3\vphantom{#2}}}%
        \normalfont%
    }{%
        \def\opt@rounded{rounded corners}%
        \def\opt@margin{0pt}%
        \def\opt@gap{5pt}%
        \def\opt@bottomColor{!60!black}%
        \def\opt@topColor{}%
        % \def\opt@baseline{2mm}%
        \ifthenelse{\equal{\badge@style}{flat}}{%
        }{%
        }%
        \ifthenelse{\equal{\badge@style}{flat-square}}{%
            \def\opt@rounded{sharp corners}%
            \def\opt@bottomColor{}%
        }{%
        }%
        %
        \ifthenelse{\equal{\badge@style}{plastic}}{%
            \def\opt@topColor{!70!white}%
        }{%
        }%
        %
        \ifthenelse{\equal{\badge@style}{for-the-badge}}{%
            \def\opt@rounded{sharp corners}%
            \def\opt@margin{3pt}%
            \def\opt@gap{10pt}%
            \def\opt@bottomColor{}%
            % \def\opt@baseline{3mm}%
        }{%
        }%
        %%
        \mbox{%
        \tcbsidebyside[
            bicolor, sidebyside,
            sidebyside adapt=both,
            nobeforeafter, nobeforeafter,
            sidebyside gap=\opt@gap,
            top=\opt@margin, left=\opt@margin, right=\opt@margin, bottom=\opt@margin,
            boxrule=0pt, \opt@rounded,
            baseline=\badge@baseline,
            interior style={top color=\badge@labelColor\opt@topColor, bottom color=\badge@labelColor\opt@bottomColor},
            segmentation style={top color=\badge@color\opt@topColor, bottom color=\badge@color\opt@bottomColor},
        ]{%  % Left bloc
            \badge@font%
            \ifx\badge@logo\@empty%
            \else%
                \droptextnoshadow{\badge@logoColor}{\badge@logo}~%
            \fi%
            \ifx#2\@empty%
            \else%
                \droptextshadow{\badge@labelColor}{\badge@colorLeft}{#2\vphantom{#3}}%
                %
            \fi%
        }{%  % Right bloc
            \badge@font%
            \droptextshadow{\badge@color}{\badge@colorRight}{#3\vphantom{#2}}%
            %
        }%
        }%
    }%
}

\newcommand{\drawBadge}[3][]{%
    %
    \def\badge@link{}%
    \def\badge@showlink{false}%
    \setkeys{badge}{#1}%
    \ifx\badge@link\@empty%
        \drawBadgeAux[#1]{#2}{#3}%
    \else%
    {%
        \ifKV@badge@showlink%
        \else%
            \hypersetup{hidelinks}%
        \fi%
        \href{\badge@link}{\mbox{\drawBadgeAux[#1]{#2}{#3}}}%
        }%
    \fi%
}

%%% Handling logo depending on the logo library that is loaded
\def\tikzshieldGithub{}
\def\tikzshieldGitlab{}
\def\tikzshieldLicence{}

\@ifpackageloaded{fontawesome}%
{%
    \PackageInfo{tikz-shield}{fontawesome is loaded}
    \def\tikzshieldGithub{\faGithub}
    \def\tikzshieldGitlab{\faGitlab}
    \def\tikzshieldLicence{\faBalanceScale}
}%
{}%

\@ifpackageloaded{fontawesome5}%
{%
    \PackageInfo{tikz-shield}{fontawesome5 is loaded}
    \def\tikzshieldGithub{\faGithub}
    \def\tikzshieldGitlab{\faGitlab}
    \def\tikzshieldLicence{\faBalanceScale}
}%
{}%

\@ifpackageloaded{fontawesome6}%
{%
    \PackageInfo{tikz-shield}{fontawesome6 is loaded}
    \def\tikzshieldGithub{\faGithub}
    \def\tikzshieldGitlab{\faGitlab}
    \def\tikzshieldLicence{\faScaleBalanced}
}%
{}%

\@ifpackageloaded{fontawesome7}%
{%
    \PackageInfo{tikz-shield}{fontawesome7 is loaded}
    \def\tikzshieldGithub{\faGithub}
    \def\tikzshieldGitlab{\faGitlab}
    \def\tikzshieldLicence{\faScaleBalanced}
}%
{}%


\NewDocumentCommand{\githubBadge}{O{} O{github} m}
{
    \drawBadge[link=https://github.com/#3, logo=\tikzshieldGithub, #1]{#2}{#3}
}

\NewDocumentCommand{\gitlabBadge}{O{} O{gitlab} m}
{
    \drawBadge[link=https://gitlab.com/#3, logo=\tikzshieldGitlab, #1]{#2}{#3}
}

\NewDocumentCommand{\forgeBadge}{O{} O{} m}
{
    \drawBadge[link=https://#3, #1]{#2}{#3}
}

\NewDocumentCommand{\licenseBadge}{O{} O{license} m}
{
    \drawBadge[link=https://creativecommons.org/#3, logo=\tikzshieldLicence, #1]{#2}{#3}
}

\NewDocumentCommand{\doiBadge}{O{} O{DOI} m}
{
    \drawBadge[link=https://doi.org/#3, #1]{#2}{#3}
}

\NewDocumentCommand{\arxivBadge}{O{} O{arXiv} m}
{
    \drawBadge[link=https://arxiv.org/abs/#3, #1]{#2}{#3}
}

\NewDocumentCommand{\halBadge}{O{} O{HAL} m}
{
    \drawBadge[link=https://hal.science/hal-#3, #1]{#2}{#3}
}

\NewDocumentCommand{\pubmedBadge}{O{} O{PubMed} m}
{
    \drawBadge[link=https://pubmed.ncbi.nlm.nih.gov/#3, #1]{#2}{#3}
}
