<?php

/*
*  Implementación hook_menu
*/
function policia_directory_menu() {

  $items['directorio'] = array(
    'title' => 'Directorio de contacto',
    'page callback' => 'policia_directory__directory',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  $items['directorio/%'] = array(
    'title' => 'Directorio de contacto',
    'page callback' => 'policia_directory__directory',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  $items['directorio/%/%'] = array(
    'title' => 'Directorio de contacto',
    'page callback' => 'policia_directory__directory',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  $items['directorio/lugar/%/%'] = array(
    'page callback' => 'policia_directory__directory_place',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
    'page arguments' => array(2,3),
  );
  
  $items['directorio/tipo_unidad/%/%'] = array(
    'page callback' => 'policia_directory__directory_unity_type',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
    'page arguments' => array(2, 3),
  );
  
  $items['directorio/busqueda_personalizada/%'] = array(
    'page callback' => 'policia_directory__directory_custom_search',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
    'page arguments' => array(2),
  );
  
  return $items;

}

/*
*  Implementación hook_theme
*/
function policia_directory_theme($existing, $type, $theme, $path) {

  return array(
      'policia_directory__directory' => array(
          'template' => 'directory',
          'arguments' => array(
            'metropolitanas'=>NULL,
            'tiposunidad'=>NULL,
          )
      )
  );

}

function policia_directory__directory($tipo, $unidad, $nid) {
  
  // Carga de librerias
  drupal_add_js("https://maps.googleapis.com/maps/api/js");
    
  // Definiciones
  $direcciones_tid = 6;  
  $oficinasasesoras_tid = 54;
  $metropolitanas_tid = 55;
  $escuelas_tid = 56;
  $gestionPoliciaFiscalAduanera = 62;
  $inspeccionGeneral = 60;
  $controlInterno = 59;
  $asuntosInternacionales = 58;
  $observatorioDelito = 63;
  
  
  $tipos_unidad_vid = 3;
  $pre_type = arg(2);
  $pre_folder = arg(1);
  
  // Precargas
  $checked = 'place';
  $category_id = null;
  $unity_id = null;
  if(arg(1) == 'unidad' && is_numeric(arg(2))){
    $preload = true;
    $node = node_load(arg(2));
    if($node && $node->type == 'unidades'){
      $tid = field_get_items('node', $node, 'field_tipo_de_unidad');
      $category_id = $tid[0]['tid'];
      $unity_id = arg(2);
      if($category_id == 55){
        $checked = 'place';
      }else{
        $checked = 'unity_type';
      }
    }elseif($node && $node->type == 'elemento_directorio'){
      $unity_id = arg(2);
      $checked = 'unity_type';
    }
  }else if( arg(1) != null && arg(2) == null) {
    $preload = true;
    $checked = 'unity_type';
  } else if (arg(1) != null && arg(2) != null) {
    $path = array();
  
    for($i = 1; $i <= 4; $i++) {
      $value = arg($i);
      if($value != null) {
        $path[] = $value;
      }      
    }
    $path = implode('/', $path);
    $internalPath =  drupal_get_normal_path($path);    
  
    if($internalPath) {
      $path = explode('/', $internalPath);  
      $node = node_load($path[1]);
      $type_tid = $node->field_tipo_de_unidad['und'][0]['tid'];
      if($type_tid == $metropolitanas_tid) {
        $checked = 'place';
        $unity_id = $node->nid;
      } else {
        $checked = 'unity_type';
        if( $direcciones_tid == $type_tid || $oficinasasesoras_tid = $type_tid ||
          $metropolitanas_tid = $type_tid || $escuelas_tid = $type_tid
        ) {
          $category_id = $type_tid;
        }
        $unity_id = $node->nid;
      }      
    }    
  }
  if($preload = true) {
    drupal_add_js('document.preload_directory = true;','inline');
  }
  drupal_add_js(drupal_get_path('module', 'policia_directory') . '/policia_directory.js');

  
  // ********** Información para llenar **************
  // Unidades por lugar  
  $unidades = db_query("select n.nid, n.title, field.field_tipo_de_unidad_tid category from {field_data_field_tipo_de_unidad} as field, {node} as n".
      " where field.entity_type='node' ".
      "AND field.bundle='unidades' " .
      " AND n.nid = field.entity_id AND n.status = 1 order by n.title");
  
  $direcciones = array();
  $oficinasasesoras = array();
  $metropolitanas = array();
  $escuelas = array();
  $otrasUnidades = array();
  foreach($unidades as $key=>$unidad) {    
    switch( $unidad->category ) {
      case 6:
        $direcciones[] = $unidad;
        break;
      case 54:
        $oficinasasesoras[] = $unidad;
        break;
      case 55:
        $metropolitanas[] = $unidad;
        break;
      case 56:
        $escuelas[] = $unidad;
        break;
      default:
        $unidad = node_load($unidad->nid);
        if( policia_fields_avalibles($unidad, 'directorio') ) {
          $otrasUnidades[] = $unidad;  
        }  
        break;
    }
    
  } 
  
  // Tipos de unidad
  $elementos_directorio = db_query("select n.nid, n.title, mn.field_directorio_machine_name_value as code from {node} as n,{field_data_field_directorio_machine_name} as mn where type = 'elemento_directorio' AND n.nid = mn.entity_id AND n.status=1");
  $elementos_tiposunidad = array(
    array('tid' => '6', 'title' => 'Direcciones'),
    //array('tid' => '55', 'title' => 'Metropolitanas y comandos'),
    array('tid' => '54', 'title' => 'Oficinas asesoras'),
    array('tid' => '56', 'title' => 'Escuelas de policia'),
  );
  
  $temp = array();
  foreach($elementos_directorio as $key=>$elemento) {
    $temp[$key] = $elemento;
  }
  $elementos_directorio = $temp;
  
  $cities_per_nid = array();
  foreach($elementos_directorio as $elemento) {
    $elemento_node = node_load($elemento->nid);
    $directorio = getElementoDirectorio($elemento_node);
    foreach($directorio as $item) {
      foreach($item['contacto'] as $contacto) {          
        if( ISSET($contacto['label']) && strtolower( $contacto['label'] ) == 'ciudad' ) {
          if( !ISSET( $cities_per_nid[$elemento->nid] ) ) {
            $cities_per_nid[$elemento->nid] = array();
          }
          $cities_per_nid[$elemento->nid][$contacto['value']] = true;
        }          
      }
    }
    if(ISSET($cities_per_nid[$elemento->nid])) {
      $cities_per_nid[$elemento->nid] = array_keys($cities_per_nid[$elemento->nid]);
      sort($cities_per_nid[$elemento->nid]);
    }
  }
  
  $directory = array(
    "checked" => $checked,
    "category_id" => $category_id,
    "unity_id" => $unity_id,
    "direcciones" => $direcciones,
    "oficinasasesoras" => $oficinasasesoras,
    "metropolitanas" => $metropolitanas,
    "otrasUnidades" => $otrasUnidades,
    "escuelas" => $escuelas,
    "cities_per_nid" => $cities_per_nid,
    "tiposunidad" => array(
      'elemento tipo unidad' => $elementos_tiposunidad,
      'elemento directorio' => $elementos_directorio,
    ),
  );
  return theme('policia_directory__directory', $directory);
  
}

function _policia_directory_normalize_title($title) {
  
  $title = str_replace('á','a',$title);
  $title = str_replace('é','e',$title);
  $title = str_replace('í','i',$title);
  $title = str_replace('ó','o',$title);
  $title = str_replace('ú','u',$title);
  $title = str_replace('ñ','n',$title);
  $title = str_replace(' ','_',$title);
  $title = strtolower($title);
  
  return $title;
  
  
}

function policia_directory__entity_load_value($entityConditions, $fieldConditions, $fields = array() ) {
  
  $values = array();
  $entity_type = $entityConditions['entity_type']['value'];
  
  $query = new EntityFieldQuery();  
  
  foreach($entityConditions as $key=>$condition) {
    $query->entityCondition($key, $condition['value'], $condition['op']);
  }
  foreach($fieldConditions as $key=>$condition) {
    $query->fieldCondition($key, $condition['subelement'], $condition['value'], $condition['op']);
  }  

  $entities = $query->execute();
  $entities = entity_load($entity_type, array_keys($entities[$entity_type]));;
  foreach($entities as $entity) {
    $entity = (array)$entity;
    $value_array = array();
    foreach($fields as $field=>$attr) {
      if( ISSET($entity[$field]) ) {        
        if(  substr($field, 0, strlen("field_")) === "field_"  ) {
          if($entity[$field]['und']['0'][$attr]) {
            $value_array[$field] = $entity[$field]['und']['0'][$attr];
          }  
        } else {
          $value_array[$field] = $entity[$field];
        }
      }
    }  
    if(count($value_array) > 0) {
      $values[] = $value_array;
    }
  }

  return $values;
  
}

function policia_directory__entity_load_directory($entityConditions, $fieldConditions, $fields, $dictionary = array()) {
  
  $directory = array();
  $entity_type = $entityConditions['entity_type']['value'];
  
  $query = new EntityFieldQuery();  
  
  foreach($entityConditions as $key => $condition) {
    $query->entityCondition($key, $condition['value'], $condition['op']);
  }
  foreach($fieldConditions as $key => $condition) {
    $query->fieldCondition($key, $condition['subelement'], $condition['value'], $condition['op']);
  }

  $entities = $query->execute();  
  $entities = entity_load($entity_type, array_keys($entities[$entity_type]));
  
  foreach($entities as $entity) {
    $entity = (array)$entity;
    foreach($fields as $field=>$attr) {
      $value = unserialize($entity[$field]['und']['0'][$attr]);
      UNSET($value['rebuild']);
      UNSET($value['import']);
      $local_directory = read_table($value);
      foreach($local_directory as $key=>$local_dir) {
        $value_text = $entity['id'];
        if( ISSET($dictionary['unidades']) && ISSET($dictionary['unidades'][$value_text]) ) {
          $value_text = $dictionary['unidades'][$value_text]['title'];
        }
        //$local_directory[$key]["basico"][] = array("label" => "Unidad", "value" => $value_text);
      }
      $directory = array_merge($directory, $local_directory);  
    }    
  }
  
  return $directory;
  
}

function policia_directory__directory_place($nid, $which) {
  
  $bigdirectory = array();
  
  $nodo = node_load($nid);
  $entity_directorio_id = $nodo->field_directorio_unidad["und"][0]["target_id"];
  
  $query = db_query("select field_estaciones_cais_value as estaciones from {field_data_field_estaciones_cais} where entity_id = ".$entity_directorio_id);
  $directory = array();
  foreach($query as $result) {
    $directory = $result->estaciones;
  }
  $value = unserialize($directory);
  UNSET($value['rebuild']);
  UNSET($value['import']);
  $directorio = read_table($value);  
  foreach($directorio as $item) {
    if($which == 'todos') {
      $bigdirectory[] = $item;
    } else {
      if($item['tipo']==$which) {
        $bigdirectory[] = $item;
      }
    }
  }
  
  if($which == 'todos') {
    $query = db_query("select field_dependencias_value as estaciones from {field_data_field_dependencias} where entity_id = ".$entity_directorio_id);
    $directory = array();
    foreach($query as $result) {
      $directory = $result->estaciones;
    }
    $value = unserialize($directory);
    UNSET($value['rebuild']);
    UNSET($value['import']);
    $directorio = read_table($value);  
    foreach($directorio as $item) {
      $bigdirectory[] = $item;      
    }  
  }
  if($which == 'dependencia') {
    $query = db_query("select field_dependencias_value as estaciones from {field_data_field_dependencias} where entity_id = ".$entity_directorio_id);
    $directory = array();
    foreach($query as $result) {
      $directory = $result->estaciones;
    }
    $value = unserialize($directory);
    UNSET($value['rebuild']);
    UNSET($value['import']);
    $directorio = read_table($value);  
    foreach($directorio as $item) {
      $bigdirectory[] = $item;      
    }  
  }
  
  
  print json_encode($bigdirectory);
  exit();
  
}

function getDependencias($node) {
  
  $entity_directorio_id = $node->field_directorio_unidad["und"][0]["target_id"];
  
  $query = db_query("select field_dependencias_value as estaciones from {field_data_field_dependencias} where entity_id = ".$entity_directorio_id);
  
  $directory = array();
  foreach($query as $result) {
    $directory = $result->estaciones;
  }
  $value = unserialize($directory);
  UNSET($value['rebuild']);
  UNSET($value['import']);
  $directorio = read_table($value);
  
  return $directorio;
  
}

function getElementoDirectorio($node) {
  
  $directory = $node->field_directorio["und"][0]["value"];
  $value = unserialize($directory);
  UNSET($value['rebuild']);
  UNSET($value['import']);
  $directorio = read_table($value);
  
  return $directorio;
  
}


function getEstacionesYCais($node) {
  
  $entity_directorio_id = $node->field_directorio_unidad["und"][0]["target_id"];
  
  $query = db_query("select field_estaciones_cais_value as estaciones from {field_data_field_estaciones_cais} where entity_id = ".$entity_directorio_id);
  
  $directory = array();
  foreach($query as $result) {
    $directory = $result->estaciones;
  }
  $value = unserialize($directory);
  UNSET($value['rebuild']);
  UNSET($value['import']);
  $directorio = read_table($value);
  
  return $directorio;
  
}


function policia_directory__directory_unity_type($tipo, $id) {
  $directorio = null;
  if($tipo == 'elemento-directorio') {
    $directorio = policia_directory__entity_load_directory(
      array(
        'entity_type' => array('value' => 'node', 'op' => '='),
        'bundle' => array('value' => 'elemento_directorio', 'op' => '='),
        'entity_id' => array('value' => $id, 'op' => '='),
      ),
      array(                
      ),
      array(
        'field_directorio' => 'value'
      )      
    );
    /*$ciudad = arg(4);
    
    $finalItems = array();
    foreach($directorio as $item) {
      $add = false;
      foreach($item['contacto'] as $contacto) {
        if( strtolower($contacto['label']) == 'ciudad') {
          if( strtolower($contacto['value']) == strtolower($ciudad) ) {
            $add = true;
          }
        }
      }
      if($add) {
        $finalItems[] = $item;
      }
    }
    $directorio = $finalItems;*/

  } else if ($tipo == 'elemento-tipounidad') {
    
    if($id == 6 || $id == 54 || $id == 56) {
      $directorio = getDependencias(node_load(arg(4)));
    }
    
  } else if ($tipo == 'elemento-otraunidad') {
    
    $directorio = getDependencias(node_load(arg(3)));
    
  }
  
  print json_encode($directorio);
  exit();
  
}

function policia_directory__directory_custom_search($text) {
  
  $text = strtolower($text);
  $text = str_replace('%20',' ',$text);
  $text = str_replace('á','a', $text);
  $text = str_replace('é','e', $text);
  $text = str_replace('í','i', $text);
  $text = str_replace('ó','o', $text);
  $text = str_replace('ú','u', $text);
  
  $words = explode(' ', $text);
  
  $global_entities = array();
  
  $entities_ids = array();
  $nodes_ids = array();
  
  $temp_entities = array();
  foreach($words as $word) {
    $query = new EntityFieldQuery();  
    $query->entityCondition('entity_type', 'unidades', '=');
    $query->entityCondition('bundle', 'directorio', '=');  
    $query->fieldCondition('field_dependencias', 'value', '%'.$word.'%', 'like');  
    $entities = $query->execute();
    $entities = entity_load('unidades', array_keys($entities['unidades']));
    foreach($entities as $key=>$entity) {
      $entities[$key]->the_id = $entities[$key]->id;
      $entities_ids[] = $entities[$key]->id;
      $entities[$key]->campo = "field_directorio";
    }
    $temp_entities = array_merge($temp_entities, $entities);
  }
  foreach($words as $word) {
    $query = new EntityFieldQuery();  
    $query->entityCondition('entity_type', 'node', '=');
    $query->entityCondition('bundle', 'elemento_directorio', '=');  
    $query->fieldCondition('field_directorio', 'value', '%'.$word.'%', 'like');  
    $entities = $query->execute();
    $entities = entity_load('node', array_keys($entities['node']));
    foreach($entities as $key=>$entity) {
      $entities[$key]->the_id = $entities[$key]->nid;
      $nodes_ids[] = $entities[$key]->nid;
      $entities[$key]->campo = null;
    }
    $temp_entities = array_merge($temp_entities, $entities);
  }
  
  foreach($temp_entities as $entity) {
    $global_entities[$entity->the_id] = $entity;
  }
  
  //Obtenemos los nodos enlazados a dichas entidades
  $unidades = policia_directory__entity_load_value(
    array(
      'entity_type' => array('value' => 'node', 'op' => '='),
      'bundle' => array('value' => 'unidades', 'op' => '='),
    ),
    array(
      'field_tipo_de_unidad' => array('subelement'=>'tid','value' => $id, 'op' => '='),
    ),
    array(
      'field_directorio_unidad' => 'target_id',
      'nid' => null,
      'title' => null,
    )
  );

  
  
  
  $global_directory = array();  
  
  foreach($global_entities as $entity) {
    $value = unserialize($entity->field_dependencias['und'][0]['value']);
    UNSET($value['rebuild']);
    UNSET($value['import']);
    $local_directory = read_table($value);
    
    foreach($local_directory as $key=>$directory) {
      $local_directory[$key]['entity'] = $entity;
    }
    
    $validlocal_directory = array();    
    foreach($local_directory as $key=>$item) {
          
      $checklist = array();
      foreach($words as $word) {
        if( $word && trim($word) != "" ) {
          $checklist[$word] = false;  
        }        
      }

      foreach($item['basico'] as $basico) {        
        $basico_value = strtolower($basico['value']);
        $basico_value = str_replace('á','a', $basico_value);
        $basico_value = str_replace('é','e', $basico_value);
        $basico_value = str_replace('í','i', $basico_value);
        $basico_value = str_replace('ó','o', $basico_value);
        $basico_value = str_replace('ú','u', $basico_value);

        foreach($checklist as $word=>$word_exists) {
          if( strpos(' '.$basico_value, $word) > 0 ) {
            $checklist[$word] = true;
          }  
        }        
      }
      
      $util = true;
      foreach($checklist as $word=>$word_exists) {
        if( !$word_exists ) {
          $util = false;
        }  
      }
      
      if($util) {
        $validlocal_directory[] = $item;
      }
    }
    $global_directory = array_merge($global_directory, $validlocal_directory);
    
  }
  
  
  //Averiguamos y asignamos el nodo al que pertenece
  $unidades = policia_directory__entity_load_value(
    array(
      'entity_type' => array('value' => 'node', 'op' => '='),
      'bundle' => array('value' => 'unidades', 'op' => '='),
    ),
    array(
      'field_directorio_unidad' => array('subelement'=>'target_id','value' => $entities_ids, 'op' => 'in'),
    ),
    array(
      'field_directorio_unidad' => 'target_id',
      'nid' => null,
      'title' => null,
    )
  );
  $directorioEntity_ids = array_map(function($unidad) { return $unidad['field_directorio_unidad'] ;}, $unidades );
  $dictionary_unidades_por_entityId = array();
  foreach($unidades as $unidad) {
    $dictionary_unidades_por_entityId[$unidad['field_directorio_unidad']] = $unidad;
  }
  
  
  
  foreach($global_directory as $key=>$local_dir) {
    $entity = (array)$global_directory[$key]["entity"];
    if($entity['campo'] == null) {
      $value_text = $entity['title'];
    } else {
      $value_text = $dictionary_unidades_por_entityId[$entity['the_id']]['title'];      
    }        
    
    $global_directory[$key]["basico"][] = array("label" => "", "value" => $value_text);
    UNSET($global_directory[$key]["entity"]);
    
    if($value_text == null) {
      UNSET($global_directory[$key]);
    }
  }
  
  print json_encode($global_directory);
  exit();
  
}

function read_table($data) {
  
  $res = array();
  
  foreach($data as $cell_key=>$cell_value) {
    $vals = explode('_', $cell_key);
    $fila = $vals[1];
    $columna = $vals[2];
    if( !ISSET($res[$fila]) ) $res[$fila] = array();
    $res[$fila][$columna] = $cell_value;
  }
  
  $objetos = array();
  
  $breaker = -1;
  foreach($res[0] as $col_id=>$columna) {
    if(trim($columna) == "") {
      $breaker = $col_id;
    }
  }
  
  foreach($res as $fila_id=>$fila) {
    $objeto = array(
      'basico' => array(),
      'contacto' => array(),
    );
    
    $hay_algo = false;
    
    if($fila_id > 0) {
      
      $estacion = false;
      $cai = false; 
      $cuadrante = false;
      
      foreach($fila as $col_id=>$columna) {
        
        if(trim($columna) != "") {
          $hay_algo = true;
          
          if($res[0][$col_id] == 'Estación') {
            $estacion = true;
          } else if($res[0][$col_id] == 'CAI') {
            $cai = true;
          } else if($res[0][$col_id] == 'Cuadrante') {
            $cuadrante = true;
          }
          
          if( ($breaker > -1 && $col_id < $breaker) || ($breaker == -1 && $col_id == 0)  ) {
            $objeto['basico'][] = array(
              'label' => $res[0][$col_id],
              'value' => $columna,
            );  
          } else {
            $objeto['contacto'][] = array(
              'label' => $res[0][$col_id],
              'value' => $columna,
            );
          }          
        }
        
      }
      
      if($cuadrante) {
        $objeto['tipo'] = 'cuadrante';
      } else if ($cai) {
        $objeto['tipo'] = 'cai';
      } else if ($estacion) {
        $objeto['tipo'] = 'estacion';
      } else {
        $objeto['tipo'] = 'otro';
      }
      
      if($hay_algo) {
        $objetos[] = $objeto;  
      }      
      
    }
    
  }
  
  return $objetos;
  
}





