%%%
% Lego
%%%
\def\filedateLego{2025/05/27}%
\def\fileversionLego{0.1b}%
\message{-- \filedateLego\space v\fileversionLego}%
%
\setKVdefault[Lego]{Echelle=1,Couleur=LightSteelBlue,Unite=8,Diviseur=2,Plaque=false,Largeura=2,Largeurb=2,Unique=false,ListePerso={}}%

\makeatletter
\NewDocumentCommand\PfC@ChoixCouleur{m}{%
  \edef\PfC@ListeCouleursAv{Maroon,PeachPuff,Yellow,red,Gray,Crimson,Cornsilk,Purple,Cornsilk,Salmon}%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfC@ListeCouleurs{\PfC@ListeCouleursAv}%
  \reademptyitems%
  \xintifboolexpr{\fpeval{#1+1}>\PfC@ListeCouleurslen}{\textbf{! Vous demandez trop de couleurs !}}{%
    \MelangeListe{1,2,3,4,5,6,7,8,9,10}{\fpeval{#1+1}}%
    \setsepchar{,}\ignoreemptyitems%
    \readlist*\PfC@ListeRotation{\faa}%
    \reademptyitems%
    \xintFor* ##2 in{\xintSeq{1}{#1}}\do{%
      \edef\PfC@RetiensCouleur{\PfC@ListeRotation[##2]}%
      \xintifForFirst{\edef\PfC@FooCouleur{\PfC@ListeCouleurs[\PfC@RetiensCouleur]}}{\edef\PfC@FooCouleur{\PfC@FooCouleur,\PfC@ListeCouleurs[\PfC@RetiensCouleur]}}%
    }%
  }%
}%

\NewDocumentCommand\Lego{o}{%
  \useKVdefault[Lego]%
  \setKV[Lego]{#1}%
  \xintifboolexpr{\useKV[Lego]{Unite}==1 || \useKV[Lego]{Unique}}{%
    \edef\PfC@NbCouleurs{1}%
  }{%
    \edef\PfC@NbCouleurs{\fpeval{floor(\useKV[Lego]{Unite}/\useKV[Lego]{Diviseur})}}%
  }%
  \ifemptyKV[Lego]{ListePerso}{%
    \PfC@ChoixCouleur{\PfC@NbCouleurs}%
    \PfC@BuildBarreLego{\PfC@FooCouleur}{}%
  }{%
    \edef\PfC@FooLegoListePerso{\useKV[Lego]{ListePerso}}%
    \setsepchar{,}\ignoreemptyitems%
    \readlist*\PfC@ListeAvantChoixCouleurs{\PfC@FooLegoListePerso}%
    \PfC@ChoixCouleur{\PfC@ListeAvantChoixCouleurslen}%
    \reademptyitems%
    \PfC@BuildBarreLego{\PfC@FooCouleur}{\PfC@FooLegoListePerso}%
  }%
}%

\NewDocumentCommand\PfC@BuildBarreLego{mm}{%
  \edef\PfCAroFooCouleur{#1}%
  \edef\PfCAroFooLegoListePerso{#2}%
  \mplibforcehmode%
  \begin{mplibcode}%
    boolean Plaque,Unique,Perso;
    Plaque=\useKV[Lego]{Plaque};
    Unique=\useKV[Lego]{Unique};

    Echelle=\useKV[Lego]{Echelle};
      
    input PfCLego;
      %
    vardef ChoixCouleur(text t)=
      color Brique[];
      nbc:=0;
      for p_=t:
        Brique[nbc]=p_;
        nbc:=nbc+1;
      endfor;
    enddef;
    % 
    vardef ListePerso(text t)=
      nbperso=0;
      for p_=t:
        Diviseurs[nbperso]=p_;
        nbperso:=nbperso+1;
      endfor;
    enddef;
    % 
    ChoixCouleur(\PfCAroFooCouleur);
    % 
    Longueur=\useKV[Lego]{Unite};
    Largeura=\useKV[Lego]{Largeura};
    Largeurb=\useKV[Lego]{Largeurb};
    Diviseur=\useKV[Lego]{Diviseur};
    color BriqueUnite;
    BriqueUnite=\useKV[Lego]{Couleur};
    %
    \ifemptyKV[Lego]{ListePerso}{Perso=false;}{Perso=true;}
    % 
    euler(-45,0,0);
    if Plaque:
      lego_height_old:=lego_height;
      lego_height:=lego_thickness;
      TR:=(0,1,0);
      Lego_box(2*Longueur,4*Largeura,Gold);
      TR:=(0,0,0);
      lego_height:=lego_height_old;
    fi;      
    Lego_box(Longueur,Largeura,BriqueUnite);
    if Unique=false:
      if Perso:
        Somme=0;
        ListePerso(\PfCAroFooLegoListePerso);
        for k=0 upto (nbperso-1):
          TR:=(0.5*(Longueur-Diviseurs[k]-Somme),Largeura+0.5*(Largeurb-Largeura),0);
          Lego_box(Diviseurs[k],Largeurb,Brique[k]);
          Somme:=Somme+2*Diviseurs[k];
        endfor;
      else:
        for k=0 upto ((Longueur div Diviseur)-1):
          TR:=(0.5*(Longueur-Diviseur)-k*Diviseur,Largeura+0.5*(Largeurb-Largeura),0);
          Lego_box(Diviseur,Largeurb,Brique[k]);
        endfor;
      fi;
    fi;
    picture RetiensLego;
    RetiensLego=currentpicture;
    currentpicture:=nullpicture;
    draw RetiensLego scaled Echelle;
  \end{mplibcode}%
}%
\makeatother