<?php
class Image {

  /**
   * Renderiza a seção de edição da imagem selecionada.
   * 
   * @param mixed $id O id da imagem.
   * @return string O código HTML da seção de edição.
   */
  private static function editor($id) {
    $html = sprintf('
      <div class="o2-image-field-editor">
        <button type="button" title="Remover" class="o2-image-field-remove"><span class="material-icons">delete</span></button>
        <button type="button" title="Editar" class="o2-image-field-edit"><span class="material-icons">edit</span></button>
        <img src="%s" class="o2-image-field-editor-image">
      </div>
    ', wp_get_attachment_image_url($id, 'full'));
    return $html;
  }

  /**
   * Renderiza a seção de detalhes da imagem selecionada.
   * 
   * @param mixed $id O id da imagem.
   * @return string O código HTML da seção de detalhes.
   */
  private static function details($id) {
    $image_data = wp_get_attachment_metadata($id);
    $html = '
      <div class="o2-image-field-datails">
        <div>
          <b>Título: </b>
          <span class="o2-image-field-details-title">%s</span>
        </div>
        <div>
          <b>Nome do arquivo: </b>
          <span class="o2-image-field-details-filename">%s</span>
        </div>
        <div>
          <b>Tipo do arquivo: </b>
          <span class="o2-image-field-details-type">.%s</span>
        </div>
        <div>
          <b>Dimensão: </b>
          <span class="o2-image-field-details-dimension">%s</span>
        </div>
        <div>
          <b>Tamanho: </b>
          <span class="o2-image-field-details-filesize">%s</span>
        </div>
      </div>
    ';

    if ($image_data) {

      $image_file = basename(get_attached_file($id));
      $image_type = pathinfo($image_file, PATHINFO_EXTENSION);
      $image_size = filesize(get_attached_file($id));

      if (!empty($image_size)) {
        $size = $image_size;
        $units = array('B', 'KB', 'MB', 'GB', 'TB');
        $unit_index = 0;

        while ($size >= 1024 && $unit_index < count($units) - 1) {
          $size /= 1024;
          $unit_index++;
        }

        $size = round($size, 2) . ' ' . $units[$unit_index];
      }

      $image_size_formated = $size;
      $image_width = $image_data['width'];
      $image_height = $image_data['height'];

      $formated = sprintf(
        $html,
        get_the_title($id),
        $image_file,
        $image_type,
        $image_width . 'x' . $image_height,
        $image_size_formated
      );
    } else {
      $formated = sprintf($html, "", "", "", "", "");
    }
    return $formated;
  }

  /**
   * Renderiza a seção quando nenhuma imagem é selecionada.
   * @return string O código HTML da seção sem imagem selecionada.
   */
  private static function unselected() {
    $html = sprintf('
      <button type="button" title="Adicionar Imagem" class="o2-button-icon o2-button-blue o2-image-field-add">
        Adicionar
        <span class="material-icons">add</span>
      </button>
      Nenhuma imagem selecionada
    ');

    return $html;
  }

  /**
   * Renderiza o campo de imagem.
   * 
   * @param string $key O nome do campo.
   * @param mixed $value O id da imagem.
   * @param string $size Dimensão do campo.
   * @return string O código HTML do campo de imagem.
   */
  public static function render($key,  $value, $size) {
    $selected = wp_attachment_is_image($value);
    $size_class = "";

    switch ($size) {
      case 'small':
        $size_class = 'o2-image-field-small';
        break;
      case 'medium':
        $size_class = 'o2-image-field-medium';
        break;
      case 'large':
        $size_class = 'o2-image-field-large';
        break;
    }

    $html = sprintf('<div class="o2-image-field %s">', $size_class);

    $html .= sprintf('<div class="o2-image-field-unselected %s">%s</div>', ($selected ? "d-none" : ""), self::unselected());
    $html .= sprintf('<div class="o2-image-field-selected %s">%s%s</div>', ($selected ? "" : "d-none"), self::editor($value, $size), self::details($value));
    $html .= Input::render(['name' => $key, 'value' => $value, 'type' => 'hidden']);

    $html .= '</div>';
    return $html;
  }
}
