<?php

/**
 * Gera um campo de texto HTML.
 *
 * Esta função gera um campo de texto HTML com base no nome do campo e em atributos adicionais fornecidos.
 *
 * @param string $key O nome do campo.
 * @param array $attributes Atributos adicionais para o campo.
 * @return string O campo de texto HTML renderizado.
 */
function o2_get_text_field($key, $attributes = []) {
  $attribute_values = array_merge(Helper::get_attr($key), $attributes, ["type" => "text"]);
  return Input::render($attribute_values);
}

/**
 * Imprime um campo de texto HTML.
 *
 * Esta função imprime um campo de texto HTML com base no nome do campo e em atributos adicionais fornecidos.
 *
 * @param string $key O nome do campo.
 * @param array $attributes Atributos adicionais para o campo.
 */
function o2_text_field($key, $attributes = []) {
  echo o2_get_text_field($key, $attributes);
}

/**
 * Gera um campo do tipo número HTML.
 *
 * Esta função gera um campo de número HTML com base no nome do campo e em atributos adicionais fornecidos.
 *
 * @param string $key O nome do campo.
 * @param array $attributes Atributos adicionais para o campo.
 * @return string O campo de número HTML renderizado.
 */
function o2_get_number_field($key, $attributes = []) {
  $attribute_values = array_merge(Helper::get_attr($key), $attributes, ["type" => "number"]);
  return Input::render($attribute_values);
}

/**
 * Imprime um campo de número HTML.
 *
 * Esta função imprime um campo de número HTML com base no nome do campo e em atributos adicionais fornecidos.
 *
 * @param string $key O nome do campo.
 * @param array $attributes Atributos adicionais para o campo.
 */
function o2_number_field($key, $attributes = []) {
  echo o2_get_number_field($key, $attributes);
}

/**
 * Gera um campo do tipo radio HTML.
 *
 * Esta função gera um campo de radio HTML com base no nome do campo, nas opções e nos atributos adicionais fornecidos.
 *
 * @param string $key O nome do campo.
 * @param array $options Opções do campo.
 * @param string $direction Direção do layout dos radio buttons: "horizontal" (padrão) ou "vertical".
 * @param array $attributes Atributos adicionais para o campo.
 * @return string O campo de radio HTML renderizado.
 */
function o2_get_radio_field($key, $options, $direction = 'horizontal', $attributes = []) {
  $direction = $direction == 'vertical' ? 'vertical' : 'horizontal';
  $html = sprintf(
    '
      <div class="o2-radio-field %s">
          %s
      </div>
      ',
    "o2-radio-field-" . $direction,
    Radio::render($options, array_merge($attributes, Helper::get_sanitized_attr($key)))
  );
  return $html;
}

/**
 * Imprime um campo do tipo radio HTML.
 *
 * Esta função imprime um campo de radio HTML com base no nome do campo as opções e atributos adicionais fornecidos.
 *
 * @param string $key O nome do campo.
 * @param array $options Opções do campo.
 * @param string $direction Direção do layout dos radio buttons: "horizontal" (padrão) ou "vertical".
 * @param array $attributes Atributos adicionais para o campo.
 */
function o2_radio_field($key, $options, $direction = 'horizontal', $attributes = []) {
  echo o2_get_radio_field($key, $options, $direction, $attributes);
}

/**
 * Gera um campo de texto HTML do tipo textarea
 *  
 * Esta funlão gera um campo de texto HTML do tipo textarea com base no nome do campo e atributos adicionais fornecidos.
 * 
 * @param string $key O nome do campo.
 * @param array $attributes Atributos adicionais para o campo.
 * @return string O campo de texto HTML renderizado.
 */
function o2_get_textarea_field($key, $attributes = []) {
  $attribute_values = Helper::get_attr($key);
  $attrs = [
    "name" => $attribute_values['name'],
    "rows" => 5,
    "cols" => 40
  ];
  return Textarea::render(array_merge($attrs, $attributes), $attribute_values['value']);
}

/**
 * Imprime um campo de texto HTML do tipo textarea.
 *
 * Esta função imprime um campo de texto HTML tipo textarea com base no nome do campo e em atributos adicionais fornecidos.
 *
 * @param string $key O nome do campo.
 * @param array $attributes Atributos adicionais para o campo.
 */
function o2_textarea_field($key, $attributes = []) {
  echo o2_get_textarea_field($key, $attributes);
}

/**
 * Gera um campo HTML do tipo select.
 *
 * Esta função gera um campo HTML do tipo select com base no nome do campo, nas opções fornecidas e nos atributos adicionais.
 *
 * @param string $key O nome do campo.
 * @param array $options Opções do campo.
 * @param array $attributes Atributos adicionais para o campo.
 * @return string O HTML do select renderizado.
 */
function o2_get_select_field($key, $options, $attributes = []) {
  return Select::render($options, array_merge($attributes, Helper::get_sanitized_attr($key)));
}

/**
 * Imprime um campo HTML do tipo select.
 *
 * Esta função imprime um campo HTML do tipo select com base no nome do campo, nas opções fornecidas e nos atributos adicionais.
 *
 * @param string $key O nome do campo.
 * @param array $options Opções do campo.
 * @param array $attributes Atributos adicionais para o campo.
 */
function o2_select_field($key, $options, $attributes = []) {
  echo o2_get_select_field($key, $options, $attributes);
}

/**
 * Gera um campo HTML do tipo checkbox.
 *
 * Esta função gera um campo HTML do tipo checkbox com base no nome do campo, nas opções fornecidas e nos atributos adicionais.
 *
 * @param string $key O nome do campo.
 * @param array $options Opções do campo.
 * @param string $direction Direção do layout dos checkboxes: "horizontal" (padrão) ou "vertical".
 * @param array $attributes Atributos adicionais para o campo.
 * @return string O HTML do campo de checkbox renderizado.
 */
function o2_get_checkbox_field($key, $options, $direction = 'horizontal', $attributes = []) {
  $direction = $direction == 'vertical' ? 'vertical' : 'horizontal';
  $html = sprintf(
    '
      <div class="o2-checkbox-field %s">
          %s
      </div>
      ',
    "o2-checkbox-field-" . $direction,
    Checkbox::render($options, array_merge($attributes, Helper::get_attr($key)))
  );
  return $html;
}

/**
 * Imprime um campo HTML do tipo checkbox.
 *
 * Esta função imprime um campo HTML do tipo checkbox com base no nome do campo, nas opções fornecidas e nos atributos adicionais.
 *
 * @param string $key O nome do campo.
 * @param array $options Opções do campo.
 * @param string $direction Direção do layout dos checkboxes: "horizontal" (padrão) ou "vertical".
 * @param array $attributes Atributos adicionais para o campo.
 */
function o2_checkbox_field($key, $options, $direction = 'horizontal', $attributes = []) {
  echo o2_get_checkbox_field($key, $options, $direction, $attributes);
}

/**
 * Gera um campo de imagem.
 *
 * Esta função gera um campo de imagem com base no nome do campo e no tamanho específico.
 *
 * @param string $key O nome do campo.
 * @param string $size Dimensão do campo: "small", "medium", "large"
 * @return string O campo de imagem HTML renderizado.
 */
function o2_get_image_field($key, $size = "medium") {
  $attrs = Helper::get_sanitized_attr($key);
  return Image::render($attrs['name'], $attrs['value'], $size);
}

/**
 * Imprime um campo de imagem.
 *
 * Esta função imprime um campo de imagem com base no nome do campo e no tamanho específico.
 *
 * @param string $key O nome do campo.
 * @param string $size Dimensão do campo: "small", "medium", "large"
 */
function o2_image_field($key, $size = "medium") {
  echo o2_get_image_field($key, $size);
}

/**
 * Retorna o HTML para exibir um campo de editor do WordPress.
 *
 * Esta função retorna o HTML para exibir um campo de editor do WordPress com base no nome do campo e nas configurações fornecidas.
 *
 * @param string $key O nome do campo.
 * @param array $settings Configurações adicionais para o campo de editor.
 * @return string O HTML para exibir o campo de editor.
 */
function o2_get_editorwp_field($key, $settings = array()) {
  $attribute_values = Helper::get_attr($key);

  $editor_id = $attribute_values["name"];
  $editor_id = str_replace('[', '-', $editor_id);
  $editor_id = str_replace(']', '-', $editor_id);

  $settings = array_merge($settings, [
    'textarea_name' => $attribute_values['name'],
    'textarea_rows' => 400, // Ajuste o número de linhas (altura) do editor conforme necessário
    'teeny' => false, // Se deseja usar o editor "teeny" (true) ou o editor completo (false)
  ]);

  ob_start();
  wp_editor($attribute_values["value"], $editor_id, $settings);
  return ob_get_clean();
}

/**
 * Imprime um campo de editor do WordPress.
 *
 * Esta função imprime um campo de editor do WordPress com base no nome do campo e nas configurações fornecidas.
 *
 * @param string $key O nome do campo.
 * @param array $settings Configurações adicionais para o campo de editor.
 */
function o2_editorwp_field($key, $settings = array()) {
  echo o2_get_editorwp_field($key, $settings);
}

/**
 * Retorna o HTML para exibir um campo de editor simples.
 *
 * Esta função retorna o HTML para exibir um campo de editor simples com base no nome do campo.
 *
 * @param string $key O nome do campo.
 * @param array $settings Configurações adicionais: 'media-buttons: true'
 * @return string O HTML para exibir o campo de editor.
 */
function o2_get_editor_field($key, $settings = []) {
  $attribute_values = Helper::get_attr($key);
  $editor_id = $attribute_values["name"];
  $editor_id = str_replace('[', '-', $editor_id);
  $editor_id = str_replace(']', '-', $editor_id);

  $attrs = [
    "name" => $attribute_values["name"],
    "id" => $editor_id,
    "class" => "o2-editor",
    "style" => "width: 100%",
  ];

  foreach ($settings as $key => $value)
    $attrs['data-' . $key] = $value;

  return Textarea::render($attrs, $attribute_values["value"]);
}

/**
 * Imprime um campo de editor simples.
 *
 * Esta função imprime um campo de editor simples com base no nome do campo.
 *
 * @param string $key O nome do campo.
 * @param array $settings Configurações adicionais: 'media-buttons: true' 
 */
function o2_editor_field($key, $settings = []) {
  echo o2_get_editor_field($key, $settings);
}

/**
 * Retorna o HTML para exibir um campo de arquivo.
 *
 * @param string $key O nome do campo.
 */
function o2_get_file_field($key) {
  $attribute_values = Helper::get_attr($key);
  return File::render($attribute_values["name"], $attribute_values["value"]);
}

/**
 * Imprime um campo de arquivo.
 *
 * @param string $key O nome do campo.
 */
function o2_file_field($key) {
  echo o2_get_file_field($key);
}

/**
 * Retorna o HTML para exibir um campo de link.
 *
 * @param string $key O nome do campo.
 */
function o2_get_link_field($key) {
  $attribute_values = Helper::get_attr($key);
  return Link::render($attribute_values['name'], $attribute_values['value']);
}

/**
 * Imprime um campo de link.
 *
 * @param string $key O nome do campo.
 */
function o2_link_field($key) {
  echo o2_get_link_field($key);
}

/**
 * Retorna o HTML para exibir um campo de seleção relacionada.
 *
 * @param string $key O nome do campo.
 * @param array $args Argumentos adicionais para o campo de seleção relacionada.
 */
function o2_get_relational_field($key, $args = array()) {
  $attribute_values = Helper::get_attr($key);
  return Relational::render($attribute_values['name'], $attribute_values['value'], $args);
}

/**
 * Imprime um campo de seleção relacionada.
 *
 * @param string $key O nome do campo.
 * @param array $args Argumentos adicionais para o campo de seleção relacionada.
 */
function o2_relational_field($key, $args = array()) {
  echo o2_get_relational_field($key, $args);
}

/**
 * Retorna o HTML para exibir um input color
 * 
 * @param string $key O nome do campo.
 */
function o2_get_color_field($key) {
  $attribute_values = array_merge(Helper::get_attr($key), ['type' => 'color']);
  return Input::render($attribute_values);
}

/**
 * Imprime o HTML para exibir um input color
 * 
 * @param string $key O nome do campo.
 */
function o2_color_field($key) {
  echo o2_get_color_field($key);
}

/**
 * Gera um campo de svg.
 *
 * Esta função gera um campo de svg com base no nome do campo e no tamanho específico.
 *
 * @param string $key O nome do campo.
 * @param string $size Dimensão do campo: "small", "medium", "large"
 * @return string O campo de svg renderizado.
 */
function o2_get_svg_field($key, $size = "medium") {
  $attrs = Helper::get_sanitized_attr($key);
  return Svg::render($attrs['name'], $attrs['value'], $size);
}

/**
 * Imprime um campo de svg.
 *
 * Esta função imprime um campo de svg com base no nome do campo e no tamanho específico.
 *
 * @param string $key O nome do campo.
 * @param string $size Dimensão do campo: "small", "medium", "large"
 */
function o2_svg_field($key, $size = "medium") {
  echo o2_get_svg_field($key, $size);
}
