<?php

/**
 * Função para recuperar o valor de um campo personalizado (custom field)
 *
 * @param string $key Chave associada ao valor
 * @param int|null $id ID da postagem vinculado ao valor (opcional)
 * @return mixed Valor do campo personalizado
 */
function o2_get_field($key, $id = null) {
  if ($id === null)
    $id = get_the_ID();

  return get_post_meta($id, $key, true);
}

/**
 * Função para imprimir o valor de um campo personalizado (custom field)
 *
 * @param string $key Chave associada ao valor
 * @param int|null $id ID da postagem vinculado ao valor (opcional)
 */
function o2_the_field($key, $id = null) {
  echo o2_get_field($key, $id);
}

/**
 * Função para recuperar o valor de um campo personalizado (custom field) de uma taxonomia.
 *
 * @param string $key Chave associada ao valor.
 * @param int $id ID da taxonomia vinculada ao valor.
 */
function o2_get_field_term($key, $id) {
  return get_term_meta($id, $key, true);
}

/**
 * Função para imprimir o valor de um campo personalizado (custom field) de uma taxonomia.
 *
 * @param string $key Chave associada ao valor.
 * @param int $id ID da taxonomia vinculada ao valor.
 */
function o2_the_field_term($key, $id) {
  echo o2_get_field_term($key, $id);
}

/**
 * Verifica se existem linhas de subcampos disponíveis
 *
 * @param string $key Chave associada aos subcampos
 * @param int|null $id ID da postagem vinculado aos subcampos (opcional)
 */
function o2_have_rows($key, $id = null) {
  if ($id === null) {
    $id = get_the_ID();
  }

  return ArrayHandlerController::have_rows($key, $id);
}

/**
 * Define a próxima linha de subcampos como a linha atual
 */
function o2_the_row() {
  ArrayHandlerController::the_row();
}

/**
 * Função para recuperar o valor de um subcampo personalizado (subfield)
 *
 * @param mixed $key Chave associada ao valor do subcampo
 * @return mixed Valor do subcampo personalizado
 */
function o2_get_sub_field($key) {
  return ArrayHandlerController::get_field($key);
}

/**
 * Função para imprimir o valor de um subcampo personalizado (subfield)
 *
 * @param mixed $key Chave associada ao valor do subcampo
 */
function o2_the_sub_field($key) {
  echo o2_get_sub_field($key);
}

/**
 * Retorna informações da imagem em diferentes formatos.
 *
 * @param int $media_id ID da imagem.
 * @param string $return Formato de retorno: "array", "img", "url" ou "id".
 * @param string $size Tamanho da imagem (opcional, padrão é "thumbnail").
 * @param array $attr Atributos da da tag img
 */
function o2_return_media($media_id, $return, $size = 'thumbnail', $attr = []) {
  switch (strtolower($return)) {
    case 'array':
      $array = array(
        'url' => '',
        'alt' => '',
        'title' => '',
        'caption' => ''
      );

      $array['url'] = wp_get_attachment_image_url($media_id, $size);

      $array['size'] = $size;
      $array['alt'] = get_post_meta($media_id, '_wp_attachment_image_alt', true);
      $array['title'] = get_the_title($media_id);
      $array['caption'] = get_the_excerpt($media_id);
      $array['attr'] = $attr;

      return $array;
      break;

    case 'img':
      return wp_get_attachment_image($media_id, $size, false, $attr);
      break;

    case 'url':
      return wp_get_attachment_image_url($media_id, $size);
      break;

    case 'id':
      return $media_id;
      break;
  }

  return false;
}

/**
 * Recupera informações da imagem em diferentes formatos.
 *
 * @param string $key Chave associada à imagem.
 * @param string $return Formato de retorno: "array", "img", "url" ou "id".
 * @param string $size Tamanho da imagem (opcional, padrão é "thumbnail").
 * @param int|null $id ID da postagem vinculado à imagem (opcional).
 * @param array $attr Atributos da da tag img
 */
function o2_get_image($key, $return, $size = 'thumbnail', $id = null, $attr = []) {
  if ($id == null)
    $id = get_the_ID();
  $image_id = o2_get_field($key, $id);
  return o2_return_media($image_id, $return, $size, $attr);
}

/**
 * Imprime informações da imagem em diferentes formatos.
 *
 * @param string $key Chave associada à imagem.
 * @param string $return Formato de retorno: "array", "img", "url" ou "id".
 * @param string $size Tamanho da imagem (opcional, padrão é "thumbnail").
 * @param int|null $id ID da postagem vinculado à imagem (opcional).
 * @param array $attr Atributos da da tag img
 */
function o2_the_image($key, $return, $size = 'thumbnail', $id = null, $attr = []) {
  echo o2_get_image($key, $return, $size, $id, $attr);
}

/**
 * Recupera informações da imagem de um subcampo em diferentes formatos.
 *
 * @param string $key Chave associada à imagem no subcampo.
 * @param string $return Formato de retorno: "array", "img", "url" ou "id".
 * @param string $size Tamanho da imagem (opcional, padrão é "thumbnail").
 * @return mixed Informações da imagem no formato especificado.
 * @param array $attr Atributos da da tag img
 */
function o2_get_sub_image($key, $return, $size = 'thumbnail', $attr = []) {
  $image_id = o2_get_sub_field($key);
  return o2_return_media($image_id, $return, $size, $attr);
}

/**
 * Imprime informações da imagem de um subcampo em diferentes formatos.
 *
 * @param string $key Chave associada à imagem no subcampo.
 * @param string $return Formato de retorno: "array", "img", "url" ou "id".
 * @param string $size Tamanho da imagem (opcional, padrão é "thumbnail").
 * @param array $attr Atributos da da tag img
 */
function o2_the_sub_image($key, $return, $size = 'thumbnail', $attr = []) {
  echo o2_get_sub_image($key, $return, $size, $attr);
}

/**
 * Retorna um link com base nas informações fornecidas.
 *
 * @param array $array Array contendo as informações do link (text, url e target).
 * @param string $class Classe do link (opcional).
 * @param array $attributes Atributos adicionais para o link (opcional).
 */
function o2_return_link($array, $class, $attributes = []) {
  if (is_array($array) & (Helper::get_value_by_indexs($array, 'text') || Helper::get_value_by_indexs($array, 'url'))) {
    $text = Helper::get_value_by_indexs($array, 'text');
    $url = Helper::get_value_by_indexs($array, 'url');
    $target = Helper::get_value_by_indexs($array, 'target');
    $attributes_array = $attributes;

    if ($target)
      $attributes_array['target'] = $target;

    if ($class)
      $attributes_array['class'] = $class;

    $attributes_html = "";
    foreach ($attributes_array as $key => $value)
      $attributes_html .= sprintf('%s="%s" ', $key, $value);

    $html = sprintf('<a href="%s" %s>%s</a>', $url, $attributes_html, $text);

    return $html;
  } else
    return "";
}

/**
 * Recupera um link personalizado e retorna-o.
 *
 * @param string $key Chave associada ao link personalizado.
 * @param string $class Classe do link (opcional).
 * @param int|null $id ID da postagem vinculada ao link (opcional).
 * @param array $attributes Atributos adicionais para o link (opcional).
 */
function o2_get_link($key, $class, $id = null, $attributes = []) {
  if ($id == null)
    $id = get_the_ID();

  $link = o2_get_field($key, $id);
  return o2_return_link($link, $class, $attributes);
}

/**
 * Imprime um link personalizado.
 *
 * @param string $key Chave associada ao link personalizado.
 * @param string $class Classe do link (opcional).
 * @param int|null $id ID da postagem vinculada ao link (opcional).
 * @param array $attributes Atributos adicionais para o link (opcional).
 */
function o2_the_link($key, $class, $id = null, $attributes = []) {
  echo o2_get_link($key, $class, $id, $attributes);
}

/**
 * Recupera um link personalizado de um subcampo e retorna-o.
 *
 * @param string $key Chave associada ao link personalizado no subcampo.
 * @param string $class Classe do link (opcional).
 * @param array $attributes Atributos adicionais para o link (opcional).
 */
function o2_get_sub_link($key, $class, $attributes = []) {
  $link = o2_get_sub_field($key);
  return o2_return_link($link, $class, $attributes);
}

/**
 * Imprime um link personalizado de um subcampo.
 *
 * @param string $key Chave associada ao link personalizado no subcampo.
 * @param string $class Classe do link (opcional).
 * @param array $attributes Atributos adicionais para o link (opcional).
 */
function o2_the_sub_link($key, $class, $attributes = []) {
  echo o2_get_sub_link($key, $class, $attributes);
}

/**
 * Recupera um campo e aplica um filtro passado por parâmetro.
 * 
 * @param string $filter Filtro a ser aplicado.
 * @param string $key Chave associado ao campo a ser recuperado.
 * @param int|null $id ID  da postagem vinculado ao campo (opcional) 
 */
function o2_get_filtered_field($filter, $key, $id = null) {
  if ($id === null)
    $id = get_the_ID();

  return apply_filters($filter, o2_get_field($key, $id));
}

/**
 * Imprime um campo aplicado o filtro passado por parâmetro.
 * 
 * @param string $filter Filtro a ser aplicado.
 * @param string $key Chave associado ao campo a ser recuperado.
 * @param int|null $id ID  da postagem vinculado ao campo (opcional) 
 */
function o2_the_filtered_field($filter, $key, $id = null) {
  echo o2_get_filtered_field($filter, $key, $id);
}

/**
 * Recupera um subcampo e aplica um filtro passado por parâmetro.
 * 
 * @param string $filter Filtro a ser aplicado.
 * @param string $key Chave associado ao campo a ser recuperado.
 */
function o2_get_filtered_sub_field($filter, $key) {
  return apply_filters($filter, o2_get_sub_field($key));
}

/**
 * Imprime um subcampo aplicado o filtro passado por parâmetro.
 * 
 * @param string $filter Filtro a ser aplicado.
 * @param string $key Chave associado ao campo a ser recuperado.
 */
function o2_the_filtered_sub_field($filter, $key) {
  echo o2_get_filtered_sub_field($filter, $key);
}

/**
 * Retorna um campo da tabela de options, pode ser passado também outros parâmetros que são indexs,  é retornado nesse caso o valor correspondente caso exista.
 * 
 * @param string $key Chave associado ao compo a ser retornado.
 * @param string ...$indexs Indexs a serem percorridos para retornar o valor. (opcional)
 */
function o2_get_option($key, ...$indexs) {
  $option_value = get_option($key);

  if ($indexs)
    return Helper::get_value_by_indexs($option_value, ...$indexs);
  else
    return $option_value;
}

/**
 * Imprime um campo da tabela de options, pode ser passado também outros parâmetrox que são indexs, é retornado nesse caso o valor correspondente caso exista.
 * 
 * @param string $key Chave associado ao compo a ser retornado.
 * @param string ...$indexs Indexs a serem percorridos para retornar o valor. (opcional)
 */
function o2_the_option($key, ...$indexs) {
  $value = o2_get_option($key, ...$indexs);
  echo !is_array($value) ? $value : "";
}

/**
 * Recupera um campo da tabela options e aplica um filtro passado por parâmetro, pode ser passado também outros parâmetrox que são indexs, é retornado nesse caso o valor correspondente caso exista.
 * 
 * @param string $filter Filtro a ser aplicado.
 * @param string $key Chave associado ao compo a ser retornado.
 * @param string ...$indexs Indexs a serem percorridos para retornar o valor. (opcional)
 */
function o2_get_filtered_option($filter, $key, ...$indexs) {
  $value = o2_get_option($key, ...$indexs);
  return apply_filters($filter, $value);
}


/**
 * Imprime um campo da tabela options e aplica um filtro passado por parâmetro, pode ser passado também outros parâmetrox que são indexs, é retornado nesse caso o valor correspondente caso exista.]
 * 
 * @param string $filter Filtro a ser aplicado.
 * @param string $key Chave associado ao compo a ser retornado.
 * @param string ...$indexs Indexs a serem percorridos para retornar o valor. (opcional)
 */
function o2_the_filtered_option($filter, $key, ...$indexs) {
  echo o2_get_filtered_option($filter, $key, ...$indexs);
}
