<?php

/**
 * Representa um Metabox de Taxonomia.
 */
class TaxonomyMetabox {
  private $title;
  private $id;
  private $term;
  private $callback;
  private $fields;

  /**
   * Obtém o ID do metabox.
   *
   * @return string O ID do metabox.
   */
  public function getId() {
    return $this->id;
  }

  /**
   * Define o ID do metabox.
   *
   * @param string $id O ID do metabox a ser definido.
   */
  public function setId($id) {
    $this->id = $id;
  }

  /**
   * Obtém o termo da taxonomia.
   *
   * @return string O termo da taxonomia.
   */
  public function getTerm() {
    return $this->term;
  }

  /**
   * Define o termo da taxonomia.
   *
   * @param string $term O termo da taxonomia a ser definido.
   */
  public function setTerm($term) {
    $this->term = $term;
  }

  /**
   * Obtém a função de retorno para renderizar o conteúdo do metabox.
   *
   * @return mixed A função de retorno.
   */
  public function getCallback() {
    return $this->callback;
  }

  /**
   * Define a função de retorno para renderizar o conteúdo do metabox.
   *
   * @param mixed $callback A função de retorno a ser definida.
   */
  public function setCallback($callback) {
    $this->callback = $callback;
  }

  /**
   * Obtém o array de chaves de campo adicionadas ao metabox.
   *
   * @return array As chaves de campo.
   */
  public function getFields() {
    return $this->fields;
  }

  /**
   * Define o array de chaves de campo para o metabox.
   *
   * @param array $fields As chaves de campo a serem definidas.
   */
  public function setFields($fields) {
    $this->fields = $fields;
  }

  /**
   * Construtor da classe TaxonomyMetabox.
   *
   * @param string $id O ID do metabox.
   * @param string $term O termo da taxonomia.
   * @param mixed $callback A função de retorno para renderizar o conteúdo do metabox.
   */
  public function __construct($id, $term, $title, $callback) {
    $this->title = $title;
    $this->id = $id;
    $this->term = $term;
    $this->callback = $callback;
    $this->fields = [];
    add_action($term . '_edit_form_fields', array($this, 'render'), 10, 2);
    add_action('created_' . $term, array($this, 'save'), 10, 2);
    add_action('edited_' . $term, array($this, 'save'), 10, 2);
  }

  /**
   * Renderiza o conteúdo do metabox.
   *
   * @param object $term O objeto do termo sendo editado.
   */
  public function render($term) {
    MetaboxController::set_metabox($this);
    echo '<div class="o2-metabox">';
    echo '<tr>';
    printf('<th>%s</th>', $this->title);
    echo '<td>';
    call_user_func($this->callback, $term);
    echo Input::render(array(
      'name' => $this->id,
      'value' => implode(',', $this->fields),
      'type' => 'hidden'
    ));
    echo '</td>';
    echo '</div>';
  }

  /**
   * Salva o conteúdo do metabox.
   *
   * @param object $term O objeto do termo sendo editado.
   */
  public function save($term_id) {
    if (!empty($_POST[$this->id])) {
     $fields = explode(',', $_POST[$this->id] ?? array());
      foreach ($fields as $key) {
        if (!empty($_POST[$key]))
          update_term_meta($term_id, $key, $_POST[$key]);
        else
          delete_term_meta($term_id, $key);
      }
    }
  }

  /**
   * Adiciona uma chave de campo ao metabox.
   *
   * @param string $key A chave do campo a ser adicionada.
   */
  public function add_field($key) {
    $this->fields[] = $key;
  }
}
