<?php
class Tree{

  private $lista_original;

  // Controles
  private $ref_filhos;

  // Saídas
  public $tree = array();
  public $tree_list = array();


  public function __construct(){}

  // Carrega a lista principal
  public function lista($lista, $campos){
    $this->lista_original = arrayIndice($lista, 'id');
    foreach($this->lista_original as $id => $l){
      $this->tree[$id]=array(
        "id"=>$id,
        "id_pai"=>$l['id_pai'],
        "arv_nivel"=>0,
        "filhos"=>array(),
      );
      foreach ($campos as $c){
        $this->tree[$id][$c] = $l[$c];
      }
    }
  }


  // TRATAMENTO DE VALORES
  // ******************************************************

  // Add valores a partir de uma lista
  public function sumValues($lista, $id="id", $v="valor"){
    foreach($lista as $l){
      $this->sumValuesExtra($l[$id], $l[$v], true);
    }
    // Insere valor zero para tree sem valor
    foreach($this->tree as $k=>$l){
      if(!isset($this->tree[$k]['total'])){ $this->tree[$k]['total']=0; }
      if(!isset($this->tree[$k]['valor'])){ $this->tree[$k]['valor']=0; }
    }
  }

  // Soma valores nas categorias e categorias pais, conforme item da lista
  public function sumValuesExtra($id, $v, $insert_valor=false){
    // Cria referencia
    $ref = & $this->tree[$id];

    // Registro do valor
    if(!isset($ref['valor'])){$ref['valor']=0;}
    if($insert_valor){$ref['valor']=$v;}
    // Soma valor ao total
    if(!isset($ref['total'])){$ref['total']=0;} $ref['total']+=$v;
    // Se possuir pai, soma também ao pai
    if(isset($ref['id_pai']) && $ref['id_pai']>0){ $this->sumValuesExtra($ref['id_pai'], $v); }
  }

  // Remove todos os registros zerados
  public function removeRegsZero(){
    foreach($this->tree as $k=>$row){
      if($this->tree[$k]['total']==0 && $this->tree[$k]['valor']==0 && $this->tree[$k]['id']!=57 && $this->tree[$k]['id']!=58 && $this->tree[$k]['id']!=11){ // Inclui primeira venda e comissão (mesmo estando zerado)
        unset($this->tree[$k]);
      }
    }
  }


  // DEFINIÇÃO DA ÁRVORE
  // ******************************************************

  // Criar a árvore
  public function arvoreCriar(){
    $refs = array(); $list = array();
    foreach($this->tree as $row){
      $ref = & $refs[$row['id']];
      $ref = $row;
      if($row['id_pai'] == 0){ $list[$row['id']] = & $ref; }else{
        $refs[$row['id_pai']]['filhos'][$row['id']] = & $ref;
      }
    }
    $this->tree = $list;
    $this->ref_filhos = & $this->tree;
    $this->arvoreLista($this->tree);
  }

  // Transforma arvore em lista
  public $nivel=0;
  public function arvoreLista($registros){
    $this->nivel++;
    foreach($registros as $k=>$l) {
      $this->tree_list[$k] = $l;
      $this->tree_list[$k]['arv_nivel'] = $this->nivel;
      unset($this->tree_list[$k]['filhos']);
      if(isset($l['filhos'])){ $this->arvoreLista($l['filhos']); $this->nivel--; }
    }
  }





  // TRANSFORMA ARVORE EM LISTA
  // ******************************************************



}