<?php 
class AppListado{

	protected $nombre;
	protected $clase;
	protected $metodo = '';
	protected $_orderby= '';
	protected $_poder_agrupar = false;
	protected $_poder_paginar = true;
	protected $_renderizar_form =true;
	protected $_datos;
	protected $parametro = array();
	protected $formulario;
	protected $_acciones = array();
	protected $_action = '';
	protected $cantidad_por_pagina = array(10,25,50);
	public $columnas = array();
	public $filtro;
	protected $_paginador_arriba = true;
	protected $_paginador_abajo = true;
	protected $_id_form= '';
	protected $_ocultar_submit = false;
	protected $_boton_editar_visible = FALSE;
	protected $_boton_editar_url = '';
	protected $_boton_editar_parametro;
	
	protected $_boton_eliminar_visible = FALSE;
	protected $_boton_eliminar_url = '';
	protected $_boton_eliminar_parametro;
	
	
	
	
	public function setBotonEliminarVisible($valor){
		$this->_boton_eliminar_visible = $valor;
	}

	public function setBotonEliminarUrl($url){
		$this->_boton_eliminar_url = $url;
	}
	
	public function setBotonEliminarUrlAddParametro($nombre, $valor){
		$this->_boton_eliminar_parametro[$nombre] = $valor;
	}
	
	public function setBotonEditarVisible($valor){
		$this->_boton_editar_visible = $valor;
	}

	public function setBotonEditarUrl($url){
		$this->_boton_editar_url = $url;
	}
	
	public function setBotonEditarUrlAddParametro($nombre, $valor){
		$this->_boton_editar_parametro[$nombre] = $valor;
	}
		
	public function setOcultarSubmit($valor){
		$this->_ocultar_submit = $valor;
	}
	
	protected $_callback_js;
	
	public function __construct(){
		$this->nombre = 'lst_'.get_class($this).(microtime(true)*10000);
		$this->init();
		$acciones = '';
		if($this->_boton_editar_visible){
			$url = '/'.CONTROLLER.'/editar';
			if(strlen($this->_boton_editar_url)>0){
				$url = $this->_boton_editar_url;
			}
			
			if(count($this->_boton_editar_parametro)>0){
				foreach ($this->_boton_editar_parametro as $key=>$value){
					$url.='/'.$key.'/'.$value;
				}
				
			}
			
			
				$boton_editar = new VstBotonListado($url, 'Editar', '', "");
				$acciones .= $boton_editar->render();
		}
		
		
		if($this->_boton_eliminar_visible){
			$url = '/'.CONTROLLER.'/eliminar';
			if(strlen($this->_boton_eliminar_url)>0){
				$url = $this->_boton_eliminar_url;
			}
				
			if(count($this->_boton_eliminar_parametro)>0){
				foreach ($this->_boton_eliminar_parametro as $key=>$value){
					$url.='/'.$key.'/'.$value;
				}
		
			}
				
		
			$boton_eliminar = new VstBotonListadoEliminar($url, 'Editar', '', "");
			$acciones .= $boton_eliminar->render();
		}
		
		
		
		//$boton_eliminar = new VstBotonListadoEliminar('usuarios/eliminar', 'Eliminar', '', "Esta seguro");
		//echo $boton_eliminar->render();
		//die();
		if(strlen($acciones)>0){
			$clm_accion = new CLMTexto('col_accion', $acciones, "Acciones");
			$clm_accion->setAncho(75);
			$this->addColumna($clm_accion);
		}
		
		
	}

	protected function setCallback($value) {
		$this->_callback_js = $value;
	}
	
	
	protected function init(){

	}
		
	public function setAction($valor){
		$this->_action = $valor;
	}
	
	public function setRenderizarForm($valor){
		$this->_renderizar_form = $valor;
	}
	
	
	private function generaFormulario(){
		$columnasForm = array();
		foreach ($this->columnas as $columna){
			if($columna instanceof AppColumna){
				if($columna->getEditable()){
					$columnasForm[] = $columna;
				}
			}
		}
		if(count($columnasForm)>0){
		
			$this->formulario = new AppFormularioDinamico();
			$clase = $this->getClase();
			
			
			
			$id_objeto = new CLMOculta($clase::getPrimary());
			$id_objeto->setEditable(true);
			$this->addColumna($id_objeto);
			$columnasForm[] = $id_objeto;
			foreach ($columnasForm as $columna){
				$campo = $columna->getCampo();
				$this->formulario->addElement($campo);
				$this->formulario->addElementoVista($campo);
			}
			
			//$evento = new EVAjax(AppEvento::APP_EVENTO_SUBMIT);
			//$evento->setUrl('/'. CONTROLLER.'/'.ACTION);
			$this->formulario->setAction('/'. CONTROLLER.'/'.ACTION, false);
			
			//	$evento->setCorrecto('alert("Se guardo correctamente");');
			//$this->formulario->addEvento($evento);
			$nclase = $this->clase;
			$clase = new $nclase();
			$this->formulario->setObjeto($clase);
			
			$this->formulario->regenera();
			$this->formulario->eventos();
		}
		
	}
		
	
	
	public function setFiltro(AppFormulario $formulario){
		$this->filtro = $formulario;
		$formulario->addGrid($this);
	}	
	

	/**
	 * Nos regresa el select de jQ del listado
	 * @return string
	 */
	public function identificadorScript(){
		$nombre = $this->getName();
		if(strlen($nombre)>0)
			return '#'.$nombre;
		else
			return '';
			
	}
	
	public function getName(){
		return $this->nombre;
	}
	
	
	public function setPoderAgrupar($bool){
		$this->_poder_agrupar = $bool;
	}
	
	public function getColumnas(){ 
	$columnas = array();
		foreach ($this->columnas as $columna){
			if ($columna instanceof AppColumna) {
				$columnas[] =  $columna->getInfo();
			}
				
		}
		return $columnas;
	}
	
	
	public function tablaHtml(){
		$html = '<table class="table table-striped no-margin sources-table table-hover dataTable"><colgroup></colgroup><thead></thead><tbody></tbody><tfoot></tfoot></table>';
		return $html;
	}
	public function cabeceraHtml(){
		
		
		$paginador = '<ul class="pagination pull-right"></ul>';
		
		
		$opciones = '';
		foreach($this->cantidad_por_pagina as $value){
			$opciones .='<option value="'.$value.'">'.$value.'</option>';
		}
		
		$select = '<span class="smart-form"><label style="width:60px" class="select"><select class="cantidadPorPagina" name="cantidadPorPagina" size="1" aria-controls="dt_basic">'
				.$opciones
		.'</select><i></i></label></span>';
		
		
		
		
		
		
		return '<div class="dt-row dt-bottom-row">
					<div class="row">
						<div class="col-sm-6">
							<div class="dataTables_info info_table" id="">Cargando...</div>
						</div>
				<div class="col-sm-2 text-right">
				
				
		'.$select.'
				
				
				</div>
						<div class="col-sm-4 text-right">
							<div class="dataTables_paginate paging_bootstrap">
							'. $paginador .'
							</div>
						</div>
					</div>
				</div>';
		return '<span class="smart-form"><label style="width:60px" class="select"><select name="dt_basic_length" size="1" aria-controls="dt_basic"><option value="10" selected="selected">10</option><option value="25">25</option><option value="50">50</option><option value="100">100</option></select><i></i></label></span>';
		return $fila->render();
		
		
		
	}
	
	public function setIdForm($id){
		$this->_id_form = $id;
		
	}
	
	public function render(){
		$this->generaFormulario();
		$salida = '';
		$datos = array();
		
		if($this->filtro && $this->filtro instanceof AppFormulario){
			$datos['filtro'] = $this->filtro->identificadorScript();
		}
		
		if($this->filtro && $this->filtro instanceof AppFormulario && $this->_renderizar_form){
			//$salida .= $this->filtro->render();	
			$datos['filtro'] = $this->filtro->identificadorScript();
		}
		
		
		if($this->_action){
			$salida .= '<form id="'.$this->_id_form.'" action="'. BASEURL . $this->_action.'" method="post">';
		}
		
		$salida .=  '<div id="'.$this->nombre.'" class="dataTables_wrapper app_listado_grid">';
		if ($this->_paginador_arriba)
			$salida .=  $this->cabeceraHtml();
		$salida .= $this->tablaHtml();
		if ($this->_paginador_abajo)
			$salida .=  $this->cabeceraHtml();
		
				
		if($this->formulario instanceof Appformulario){
			$salida .= $this->formulario->render();
			$datos['editable'] = $this->formulario->getName();
		}else{
			
		}
		
				
		$salida .= '</div>';

		$salida .='<script type="text/javascript">';
		$columnas = $this->getColumnas();
		
		$datos['nombre'] = get_class($this);
		$datos['orderby'] = $this->_orderby;
		$datos['objeto'] = $this->clase;
		$datos['metodo'] = $this->metodo;
		$datos['columnas'] = $columnas;
		$datos['agrupar'] = $this->_poder_agrupar;
		$datos['paginar'] = $this->_poder_paginar;
		$datos['paginadorArriba'] = $this->_paginador_arriba;
		$datos['paginadorAbajo'] = $this->_paginador_abajo;
		$datos['acciones']= $this->_acciones;
		$datos['parametros'] = $this->parametro;
		$datos['cantidadPorPagina'] = $this->cantidad_por_pagina;
		//metemos eventos del listado
		
		$json_data = Zend_Json_Encoder::encode($datos);
		
		$json_data = substr($json_data,0, strlen($json_data)-1). ', callback_eventos :function(linea){'.AppEvento::getRenderDeListado($this).'}}';
		$salida .= "$('#".$this->nombre."').appGrid(".$json_data.");";
		$salida.= '</script>';
		

		
		if($this->_action){
			$salida .= '<input type="submit" value="Guardar" class="btn" '.(($this->_ocultar_submit)?'style="display:none"':'').' /></form>';
		}
		
		
		return $salida;
	}
	public function setClase($class){
		$this->clase = $class;
	}
	public function getClase(){
		return $this->clase;
	}
	public function  __toString(){
		return $this->render();
	}
	public function addColumna(AppColumna $elemento){
		$this->columnas[$elemento->getName()] = $elemento;
		if($elemento->getOrdenarPorDefecto())
			$this->_orderby = $elemento->getName();
		
	}
	
	public function delColumna($nombre){
		unset($this->columnas[$nombre]);
	}
	
	public function setMetodo($nombre){
		$this->metodo = $nombre;
	}

	public function setParametroMetodo($name, $valor){
		$this->parametro[$name] = $valor;
	}
	
	public function addParametroMetodo($name, $valor){
		$this->parametro[$name] = $valor;
	}
	
	
	public function setCantidadPorPagina(array $cantidades){
		$this->cantidad_por_pagina = $cantidades;
	}
	public function setPoderPaginar($bool){
		$this->_poder_paginar = $bool;
		$this->_paginador_abajo = $bool;
		$this->_paginador_arriba = $bool;
	}

	public function setPaginadorArriba($bool){
		$this->_paginador_arriba = $bool;
	}
	
	public function setPaginadorAbajo($bool){
		$this->_paginador_abajo = $bool;
	}
	
	public static function toListado($parametros){

		$objeto = $parametros['objeto'];
		$metodo = $parametros['metodo'];
		$resultado = $objeto::$metodo($parametros['datos']);
		
		$clase = $parametros['datos']['listado'];
		$listado = new $clase();

		$listado->setDatos($resultado->getDatos());
		$listado->toArrayDatosTratados();
		$listado->aplicarCondicionantes();

		$salida = array();		
		$salida['datos'] = $listado->getDatos();
		$salida['sumatorios'] = $resultado->getSumatorios();
		$salida['total'] = $resultado->getTotal();
		//print_r($salida); 
		return $salida;
		
	}
	
	protected function aplicarCondicionantes(){
	}
	
	/**
	 * Con los datos de base de datos, columnas a mostrar y estilos
	 * @return array filas con los datos de base de datos, columnas a mostrar y estilos
	 */
	protected function toArrayDatosTratados(){
		
		$filas_tratadas = array();
		foreach ($this->_datos as $posicion => $fila){
			$datos_fila = array();	
			foreach ($this->columnas as $columna){
				if($columna instanceof AppColumna){
					$filas_tratadas[$posicion]['columnas'][$columna->getName()]['dato'] = $columna->reemplaza_datosCampo($fila);
					$filas_tratadas[$posicion]['columnas'][$columna->getName()]['atributos'] = array();
				}
			}
			$filas_tratadas[$posicion]['atributos']= array();
			$filas_tratadas[$posicion]['datosBD'] = $fila;
		}
		$this->_datos = $filas_tratadas;
	}
	
	public function setDatos($datos){
		$this->_datos = $datos;		
	}

	public function getDatos(){
		return $this->_datos;
	}
	
	/*
	
	public function addAccion($nombre, $texto, $url, $icono = null){
	$accion['texto'] = $texto;
	$accion['url'] = BASEURL.$url;
	$accion['icono'] = $icono;
	$this->_acciones[] = $accion;
	
	}
	
	public function addAccionNuevoEnGrid(){
	$accion['texto'] = 'Nuevo';
	$accion['url'] = "javascript:$('#". $this->getName()."').appGrid().siguienteFormularioNuevo()";
	$accion['icono'] = null;
	$this->_acciones[] = $accion;
	}
	
	
	public function addAccionExportaCSV($texto = 'Exporta a CSV'){
	$accion['texto'] = $texto;
	$accion['clase'] = 'exportar_csv';
	$accion['icono'] = null;
	$this->_acciones[] = $accion;
	}
	
	
	public function setUrlCreacion($url){
		$this->url_crear = $url;
	}
	
	
	public function setFiltro(AppFormulario $formulario){
		$this->filtro = $formulario;
		$formulario->addGrid($this);
	}
	
	*/
	
}