<?php

class Group {
  private static $data;

  /**
   * Método para inicialização do grupo
   * 
   * @param string $key Nome do campo. 
   */
  public static function init($key) {
    if (empty(self::$data)) {
      self::$data = [];
      $slug = $key;
      $values = Helper::get_meta($key);
      MetaboxController::add_field($key);
    } else {
      $prev_data = end(self::$data);
      $index = $key === "*" ?  $prev_data['row'] :  $key;
      $slug = $prev_data['slug'] . "[$index]";
      $values = Helper::get_value_by_indexs($prev_data['values'], $index);
      self::increment();
    }

    self::$data[] = [
      "row" => 0,
      "slug" => $slug,
      "values" => $values
    ];
  }

  /**
   * Método que retorna true/false se o estado atual do código estiver dentro de um grupo.
   * 
   * @return boolean True/False se está dentro de um grupo.
   */
  public static function in_group() {
    return !empty(self::$data) ? count(self::$data) > 0 : false;
  }

  /**
   * Método estático para incrementar a linha no ultimo valor do data
   * 
   * @param void
   * @return void 
   */
  public static function increment() {
    self::$data[array_key_last(self::$data)]['row']++;
  }

  /**
   * Método estático retorna um array com os parâmetros para iniciar um Repeat dentro de um Group
   * 
   */
  public static function init_repeat() {
    $args = array(
      "type" => "group",
      "col" => 0,
      "values" => end(self::$data)['values'],
      "slug" => end(self::$data)['slug']
    );

    return array($args);
  }

  /**
   * Método que retorna um nome para um campo conforme o estado atual do data.
   * 
   * @param string O nome do campo, para usar o valor da linha atual usar '*'.
   * @return string O nome do campo gerado.
   */
  public static function get_name($key = "*") {
    $current_data = end(self::$data);
    $name = $current_data['slug'];
    $name .= $key === "*" ? "[{$current_data['row']}]" : "[$key]";
    return $name;
  }

  /**
   * Método que retorna o valor atual conforma o nome passado e o estado atual do data.
   * 
   * @param string O nome do campo, para usar o valor da linha atual usar '*'.
   * @return string
   */
  public static function get_value($key = "*") {
    $current_data = end(self::$data);
    $index = $key === "*" ? $current_data['row'] : $key;
    return Helper::get_value_by_indexs($current_data['values'], $index);
  }

  /**
   * Método estático que retorna um array com nome e valor do campo obtidos através do get_name e get_value da classe.
   * 
   * @param srting O nome do campo, para usar o valor da linha atual usar '*'.
   * @return array O nome e valor do campo.
   */
  public static function get_attr($key = "*") {
    $data = [
      "name" => self::get_name($key),
      "value" => self::get_value($key)
    ];
    self::increment();
    return $data;
  }

  /**
   * Método de renderização do grupo.
   * 
   * @param string $key O nome do campo, para usar o valor da linha atual usar '*'.
   * @param callable $callback Função usada para renderização do grupo.
   * @return string HTML do grupo.
   */
  public static function render($key, $callback) {
    self::init($key);

    call_user_func($callback);

    array_pop(self::$data);
  }
}
