<?php
namespace nur\v\plugins;

use nur\v\BasePlugin;
use nur\v\v;
use nur\v\vo;

/**
 * Class showmorePlugin: un outil pour masquer par défaut un panneau de détails
 * et donner la possibilité à l'utilisateur de l'afficher
 *
 * s'utilise de cette façon:
 * <pre>
 * $sm = new showmorePlugin();
 * // le tout doit être dans le container startc-endc
 * $sm->printStartc();
 * // l'invite contient un lien pour afficher le panneau caché
 * $sm->printInvite();
 * // le panneau caché est dans le container startp-endp
 * $sm->printStartp();
 * $sm->printEndp();
 * $sm->printEndc();
 * </pre>
 */
class showmorePlugin extends BasePlugin {
  const HAVE_JQUERY = true;

  /** @var string classe du conteneur */
  const CONTAINER_CLASS = "showmore-container";
  /** @var string classe de l'invite à en savoir plus */
  const INVITE_CLASS = "showmore-invite";
  /** @var string classe du panneau caché par défaut */
  const INVITE_CONTENT = "En savoir plus...";
  const PANEL_CLASS = "showmore-panel";

  function __construct(?array $params=null) {
    $this->containerClass = $params["container_class"] ?? static::CONTAINER_CLASS;
    $this->inviteClass = $params["invite_class"] ?? self::INVITE_CLASS;
    $this->inviteContent = $params["invite_content"] ?? self::INVITE_CONTENT;
    $this->panelClass = $params["panel_class"] ?? self::PANEL_CLASS;
    $this->onShow = $params["on_show"] ?? null;
  }

  protected string $containerClass;

  protected string $inviteClass, $inviteContent;

  protected string $panelClass;

  protected ?string $onShow;

  protected bool $initialShow = false;

  function show(bool $show=true): self {
    $this->initialShow = $show;
    return $this;
  }

  function startc(): array {
    return v::sdiv(["class" => $this->containerClass]);
  }
  
  function invite($vs=null): array {
    $vs ??= $this->inviteContent;
    return v::a([
      "class" => [
        $this->inviteClass,
        "hidden" => $this->initialShow,
      ],
      "href" => "#",
      $vs,
    ]);
  }
  
  function startp(): array {
    return v::sdiv([
      "class" => [
        $this->panelClass,
        "hidden" => !$this->initialShow,
      ],
    ]);
  }
  
  function endp(): array {
    return ["</div>"];
  }

  function endc(): array {
    return ["</div>"];
  }
  
  function end(): array {
    return ["</div></div>"];
  }

  function printStartc(): void {
    vo::print($this->startc());
  }

  function printInvite($vs=null): void {
    vo::print($this->invite($vs));
  }

  function printStartp(): void {
    vo::print($this->startp());
  }

  function printEndp(): void {
    vo::print($this->endp());
  }

  function printEndc(): void {
    vo::print($this->endc());
  }

  function printEnd(): void {
    vo::print($this->end());
  }

  function printJquery(): void {
    ?>
<script type="text/javascript">
jQuery.noConflict()(function($) {
  $(".<?=self::INVITE_CLASS?>").click(function() {
    let $this = $(this);
    $this.addClass("hidden");
    let $container = $this.closest(".<?=self::CONTAINER_CLASS?>");
    let $panel = $container.find(".<?=self::PANEL_CLASS?>");
    $panel.removeClass("hidden");
    <?=$this->onShow?>
    return false;
  });
});
</script>
<?php
  }
}
