<?php
date_default_timezone_set("America/Montevideo");
require_once("referencias/coordinates.php");   

Class dl_fecha {
        public static function dl_ahora_date(){
            $tz_object = new DateTimeZone("America/Montevideo");
            $datetime = new DateTime();
            $datetime->setTimezone($tz_object);
            return $datetime;
        }
        public static function dl_ahora_texto(){
            $tz_object = new DateTimeZone("America/Montevideo");
            $datetime = new DateTime();
            $datetime->setTimezone($tz_object);
            return $datetime->format('Y-m-d H:i:s');
        }
        public static function dl_ahora_dia(){
            $tz_object = new DateTimeZone("America/Montevideo");
            $datetime = new DateTime();
            $datetime->setTimezone($tz_object);
            $dia = $datetime->format('D');
            switch ($dia){
                case 'Sun':
                    $diares = 'Domingo';
                    break;
                case 'Mon':
                    $diares = 'Lunes';
                    break;
                case 'Tue':
                    $diares = 'Martes';
                    break;
                case 'Wed':
                    $diares = 'Miercoles';
                    break;
                case 'Thu':
                    $diares = 'Jueves';
                    break;
                case 'Fri':
                    $diares = 'Viernes';
                    break;       
                case 'Sat':
                    $diares = 'Sabado';
                    break;  
                default:
                    $diares = 'Domingo';    
             }
             return $diares;
        }
        public static function dl_ahora_texto_nombre_archivo(){
            $tz_object = new DateTimeZone("America/Montevideo");
            $datetime = new DateTime();
            $datetime->setTimezone($tz_object);
            return $datetime->format('Y-m-d_H_i_s');
        }

        public static function dl_fecha_date_a_texto($datetime){
            if ($datetime != false)
            {
                 return $datetime->format('Y-m-d H:i:s');
            }
            else
            {
                $tz_object = new DateTimeZone("America/Montevideo");
                $datetime = new DateTime();
                $datetime->setTimezone($tz_object);
                return $datetime->format('Y-m-d H:i:s');
            }
        }

        public static function dl_fecha_texto_a_date($texto){
            if ($texto != false)
            {
            $fechares =  DateTime::createFromFormat('Y-m-d H:i:s', $texto);
                return $fechares;
            }
            else
            {
                $tz_object = new DateTimeZone("America/Montevideo");
                $datetime = new DateTime();
                $datetime->setTimezone($tz_object);
                return $datetime->format('Y-m-d H:i:s'); 
            }
        }
}

Class dl_coordenadas {
            public static function dl_sirgas_a_ll($x, $y)
            { 
                $PC_LatLon = utm2ll($x,$y);
                $res['lat'] = $PC_LatLon['lat'];
                $res['lon'] = $PC_LatLon['lon'];
            return $res;
            }
            public static function dl_ll_a_sirgas($lat, $lon)
            {
                $PC_LatLon = ll2utm($lat,$lon);
                $res['x'] = $PC_LatLon['x'];
                $res['y'] = $PC_LatLon['y'];
                return $res;
            }
}

Class dl_geometria {
            public static function dl_distancia_metros_de_geograficas($lat1,$lon1,$lat2,$lon2)
            {
                $p1 = dl_coordenadas::dl_ll_a_sirgas($lat1,$lon1);
                $p2 = dl_coordenadas::dl_ll_a_sirgas($lat2,$lon2);
                $res = sqrt(pow($p2['x'] - $p1['x'], 2) + pow($p2['y'] - $p1['y'], 2) * 1.0);
                return $res;
            }
            public static function dl_punto_cercano_linestring($lat,$lon,$linestring)
            { 
                $res = array('distancia'=>9999999,'lat'=>0,'lon'=>0);
                $menor_distancia = 99999999;
                $punto_anterior = false;
                $Puntores = false;
                $linestring = preg_replace('([^0-9 ,-.])', '', $linestring);
                $puntos = explode(",",$linestring);
                foreach ($puntos as $punto)
                        {   
                            $puntoarr = explode(' ',$punto);
                            $puntoarr[0] = floatval($puntoarr[0]);
                            $puntoarr[1] = floatval($puntoarr[1]);
                            if ($punto_anterior != false && ($punto_anterior[1] != $puntoarr[1]))
                            {

                                    $deltax = $puntoarr[0] - $punto_anterior[0];
                                    $deltay = $puntoarr[1] - $punto_anterior[1];
                                    if (!(($deltax == 0) && ($deltay == 0)))
                                    {
                                    $u =  (($lon - $punto_anterior[0]) * $deltax + ($lat - $punto_anterior[1]) * $deltay) / ($deltax * $deltax + $deltay * $deltay);
                                    }    
                                    if ($u < 0)
                                    {
                                    $closestPoint = array('lon'=>$punto_anterior[0],'lat'=>$punto_anterior[1]);       
                                    }
                                    else if ($u > 1)
                                    {
                                    $closestPoint = array('lon'=>$puntoarr[0],'lat'=>$puntoarr[1]);       
                                    }
                                    else
                                    {
                                    $lonres =  $punto_anterior[0] + $u * $deltax;
                                    $latres =  $punto_anterior[1] + $u * $deltay;
                                    $closestPoint = array('lon'=>$lonres,'lat'=>$latres);
                                    }                          
                                    $distancia = dl_geometria::dl_distancia_metros_de_geograficas($lat,$lon,$closestPoint['lat'], $closestPoint['lon']);
                                    if ($distancia < $menor_distancia)
                                    {
                                        $menor_distancia = $distancia;
                                        $Puntores = $closestPoint;
                                    } 
                            }
                            $punto_anterior = $puntoarr;
                        }
                if ($Puntores != false)
                {        
                $distancia = dl_geometria::dl_distancia_metros_de_geograficas($lat,$lon,$Puntores['lat'],$Puntores['lon']);
                //echo ("resultado de distancia = " . $distancia . "entra en menor distancia " . PHP_EOL);
                $res = array('distancia'=>$distancia,'lat'=>$Puntores['lat'],'lon'=>$Puntores['lon']);
                }
                return $res;
            }
            public static function dl_punto_en_poligono($lat1,$lon1,$poligono)
            {   $seguir = false;
                $res = false;
                if (is_string($poligono) == true){if (strlen($poligono) > 200){if(substr($poligono,0,7) == 'POLYGON'){$seguir = true;}}}
                if ($seguir == true)
                {
                    $poligon = preg_replace('([^0-9 ,-.])', '', $poligono);
                    $puntos = explode(",",$poligono);
                    $vertices_x = array();
                    $vertices_y = array();
                    $longitude_x = $lon1;
                    $latitude_y = $lat1;
                    $points_polygon = count($puntos);
                    foreach ($puntos as $punto)
                            { 
                                $coordenadas = explode(" ",$punto);
                                array_push($vertices_x,floatval($coordenadas[0]));
                                array_push($vertices_y,floatval($coordenadas[1]));
                            }
                            $i = $j = $c = false;
                            for ($i = 0, $j = $points_polygon-1 ; $i < $points_polygon; $j = $i++) {
                              if ( (($vertices_y[$i] > $latitude_y != ($vertices_y[$j] > $latitude_y)) &&
                              ($longitude_x < ($vertices_x[$j] - $vertices_x[$i]) * ($latitude_y - $vertices_y[$i]) / ($vertices_y[$j] - $vertices_y[$i]) + $vertices_x[$i]) ) ) 
                                  $c = !$c;
                            }
                            $res = $c;
                }
                return $res;
            }
}

Class dl_textos {
            public static function dl_textos_parecidos($a, $b)
                        {
                            $a = trim($a);
                            $b = trim($b);
                            if (max(strlen($a), strlen($b)) > 0)
                            {
                                return 1 - (levenshtein(strtoupper($a), strtoupper($b)) / max(strlen($a), strlen($b)));
                            }
                            else
                            { 
                                return 0;
                            } 
                        }
            //LIMPIO TILDES Y CARACTERES ESPECIALES            
            public static function dl_limpiar_texto1($cadena) {
                                if (is_string($cadena))
                                    {
                                        $cadena = str_replace(
                                        array('Á', 'À', 'Â', 'Ä', 'á', 'à', 'ä', 'â', 'ª'),
                                        array('A', 'A', 'A', 'A', 'a', 'a', 'a', 'a', 'a'), $cadena);
                                        $cadena = str_replace(
                                        array('É', 'È', 'Ê', 'Ë', 'é', 'è', 'ë', 'ê'),
                                        array('E', 'E', 'E', 'E', 'e', 'e', 'e', 'e'), $cadena );
                                        $cadena = str_replace(
                                        array('Í', 'Ì', 'Ï', 'Î', 'í', 'ì', 'ï', 'î'),
                                        array('I', 'I', 'I', 'I', 'i', 'i', 'i', 'i'), $cadena );
                                        $cadena = str_replace(
                                        array('Ó', 'Ò', 'Ö', 'Ô', 'ó', 'ò', 'ö', 'ô'),
                                        array('O', 'O', 'O', 'O', 'o', 'o', 'o', 'o'), $cadena );
                                        $cadena = str_replace(
                                        array('Ú', 'Ù', 'Û', 'Ü', 'ú', 'ù', 'ü', 'û'),
                                        array('U', 'U', 'U', 'U', 'u', 'u', 'u', 'u'), $cadena );
                                        $cadena = str_replace(
                                        array('Ç', 'ç' , '\\'),
                                        array('C', 'c' , '/'), $cadena);
                                        $cadena = preg_replace('([^A-Za-z0-9 ñÑ,./:;+_-])', '', $cadena);
                                        $cadena = trim($cadena);
                                    }
                                    else
                                    {
                                    $cadena = ''; 
                                    }    
                        return $cadena;
                        }
            //LIMPIO TILDES Y CARACTERES ESPECIALES Y NO PERMITO , NI ;
            public static function dl_limpiar_texto2($cadena) {
                                if (is_string($cadena))
                                {
                                        $cadena = str_replace(
                                        array('Á', 'À', 'Â', 'Ä', 'á', 'à', 'ä', 'â', 'ª'),
                                        array('A', 'A', 'A', 'A', 'a', 'a', 'a', 'a', 'a'), $cadena);
                                        $cadena = str_replace(
                                        array('É', 'È', 'Ê', 'Ë', 'é', 'è', 'ë', 'ê'),
                                        array('E', 'E', 'E', 'E', 'e', 'e', 'e', 'e'), $cadena );
                                        $cadena = str_replace(
                                        array('Í', 'Ì', 'Ï', 'Î', 'í', 'ì', 'ï', 'î'),
                                        array('I', 'I', 'I', 'I', 'i', 'i', 'i', 'i'), $cadena );
                                        $cadena = str_replace(
                                        array('Ó', 'Ò', 'Ö', 'Ô', 'ó', 'ò', 'ö', 'ô'),
                                        array('O', 'O', 'O', 'O', 'o', 'o', 'o', 'o'), $cadena );
                                        $cadena = str_replace(
                                        array('Ú', 'Ù', 'Û', 'Ü', 'ú', 'ù', 'ü', 'û'),
                                        array('U', 'U', 'U', 'U', 'u', 'u', 'u', 'u'), $cadena );
                                        $cadena = str_replace(
                                        array('Ç', 'ç' , '\\'),
                                        array('C', 'c' , '/'), $cadena);
                                        $cadena = preg_replace('([^A-Za-z0-9 ñÑ./:+_-])', '', $cadena);
                                        $cadena = trim($cadena);
                                    }
                                    else
                                    {
                                    $cadena = ''; 
                                    }    
                            return $cadena;
                            }          
            public static function dl_preparo_texto_para_json($string){ 
                         return preg_replace('/[\s]+|[\t]/', ' ', trim($string));
                         }
}

Class dl_tablas
{
    public static function dl_tablas_iguales($conexion1,$tabla1,$conexion2,$tabla2)
                {
                    $resultado = true;
                    $sql1 = "SELECT COUNT(*) AS CANTIDAD FROM " . $tabla1;
                    $cantidad1 = mysqli_fetch_assoc(mysqli_query($conexion1,$sql1))["CANTIDAD"];
                    $sql2 = "SELECT COUNT(*) AS CANTIDAD FROM " . $tabla2;
                    $cantidad2 = mysqli_fetch_assoc(mysqli_query($conexion2,$sql2))["CANTIDAD"];
                    if ($cantidad1 != $cantidad2)
                    {
                        $resultado = false;
                    }
                    else
                    {
                        $lista_filas1 = array();    
                        $sql = 'DESCRIBE ' . $tabla1;
                        $result = mysqli_query($conexion1, $sql);
                        $campos_texto1 = '';
                        while($row = mysqli_fetch_assoc($result)) {
                        $row['Field'] == 'SHAPE' || $row['Field'] == 'GEOMETRIA' ? $campos_texto1 .=  "ASTEXT(" . $row['Field'] . ")," : $campos_texto1 .= $row['Field']  . "," ;
                        }
                        $campos_texto1 = substr($campos_texto1, 0, -1);
                        $sql = "SELECT CONCAT(" . $campos_texto1 . ") AS FILA FROM " . $tabla1 . " WHERE 1";
                        $result = mysqli_query($conexion1, $sql);
                        while($row = mysqli_fetch_assoc($result))
                        {
                            array_push($lista_filas1,$row["FILA"]);
                        }  
                        $lista_filas2 = array();    
                        $sql = 'DESCRIBE ' . $tabla2;
                        $result = mysqli_query($conexion2, $sql);
                        $campos_texto2 = '';
                        while($row = mysqli_fetch_assoc($result)) {
                        $row['Field'] == 'SHAPE' || $row['Field'] == 'GEOMETRIA' ? $campos_texto2 .=  "ASTEXT(" . $row['Field'] . ")," : $campos_texto2 .= $row['Field']  . "," ;
                        }
                        $campos_texto2 = substr($campos_texto2, 0, -1);
                        $sql = "SELECT CONCAT(" . $campos_texto2 . ") AS FILA FROM " . $tabla2 ." WHERE 1";
                        $result = mysqli_query($conexion2, $sql);
                        while($row = mysqli_fetch_assoc($result))
                        {
                            array_push($lista_filas2,$row["FILA"]);
                        }   
                        for ($i=0;$i<count($lista_filas1);$i++)
                        {
                            if ($lista_filas1[$i] != $lista_filas2[$i])
                            {
                                $resultado = false;
                                break;
                            }
                        }
                    }
                    $result = null;
                    $lista_filas1 = null;
                    $lista_filas2 = null;
                return $resultado;
                }
}



Class dl_historial
{
    public static function dl_agrego_evento_a_historial($historial,$descripcion,$usuario)
                {
                    $historial_final = '';
                    $fecha = dl_fecha::dl_ahora_texto();
                    if ($historial != '')
                    {
                    $historial_array = json_decode($historial,true);
                    }
                    else
                    {
                     $historial_array =  array();   
                    }
                    $nuevo_elemento = array('descripcion'=>$descripcion, 'fecha'=>$fecha, 'usuario'=>$usuario);
                    array_push($historial_array,$nuevo_elemento);
                    $historial_final = json_encode($historial_array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
                    return $historial_final;
                }
}

?>

