<?php

class Archivos {



  public static

    function guardarImagenBase64($imgBase64, $nombreArchivo, $carpetaArchivo ) {        

        if (!is_dir($carpetaArchivo)) {

            mkdir($carpetaArchivo);

        }

        $img = str_replace('data:image/png;base64,', '', $imgBase64);

        $img = str_replace(' ', '+', $img);

        $data = base64_decode($img);

        $file = $carpetaArchivo . $nombreArchivo . ".png";

        $success = file_put_contents($file, $data);

        return str_replace(array('"', '\\'), array('', '/'), ($file));

    }



  public static

   function conteoArchivo($dirArchivo) {

    $archivo = fopen($dirArchivo, "r");

    $conteo['num_lineas'] = 0;

    $conteo['caracteres'] = 0;

    while(!feof($archivo)) {

      if($linea = fgets($archivo)) {

        $conteo['num_lineas'] ++;

        $conteo['caracteres'] += strlen($linea);

      }

    }

    fclose($archivo);

    return $conteo;

  }



  public static

   function nombreExtension($archivo) {

    return $ext = pathinfo($archivo['name'], PATHINFO_EXTENSION);

  }



  public static

   function extension($archivo) {

    return $ext = pathinfo($archivo['name'], PATHINFO_EXTENSION);

  }



  static public

   function limpiarCaracteresEspeciales($string) {

    $string = str_replace(' ', '-', $string);

    $string = preg_replace('/\&(.)[^;]*;/', '\\1', $string);

    return $string;

  }



  static public

   function leerArchivo($archivo) {

    if(file_exists($archivo)) {

      return file_get_contents($archivo);

    }

    return "";

  }



  static public

    function leerLineaArchivo($archivo, $linea = 0) {

    $leida = "";

    $numLinea = 0;

    if(file_exists($archivo)) {

      $file = fopen($archivo, "r");

      while(!feof($file)) {

        $lineaLeida = fgets($file);

        if($numLinea == $linea) {

          $leida = $lineaLeida;

          break;

        }

        $numLinea++;

      }

      fclose($file);

    }

    return $leida;

  }



  static public

   function borrarLineaArchivo($archivo, $linea = 0) {

    $leidas = array();

    $numLinea = 0;

    if(file_exists($archivo)) {

      $file = fopen($archivo, "r");

      while(!feof($file)) {

        $lineaLeida = fgets($file);

        if($numLinea != $linea) {

          array_push($leidas, $lineaLeida);

          break;

        }

        $numLinea++;

      }

      fclose($file);

    }

    return file_put_contents($archivo, $leidas);

  }



  static public

   function leerArchivoPlanoSeparadoPorLinea($archivo, $separador = ";") {



    $arreglo = array();

    if(file_exists($archivo)) {

      $file = fopen($archivo, "r");

      $numLinea = 0;

      while(!feof($file)) {

        $linea = fgets($file);

        $datos = explode($separador, $linea);

        if(count($datos)) {

          $linea = array();

          foreach($datos as $kndex => $valor) {

            array_push($linea, utf8_encode($valor));

          }

          array_push($arreglo, $linea);

          $numLinea++;

        }

      }

      fclose($file);

      return $arreglo;

    }

    return NULL;

  }



  static public

   function leerArchivoPlanoSeparadoPorLineaEncabezado($archivo, $separador = ";") {



    $arregloEncabezados = array();

    $arregloObjetos = array();

    if(file_exists($archivo)) {

      $file = fopen($archivo, "r");

      $numLinea = 0;

      while(!feof($file)) {

        $linea = fgets($file);

        $datos = explode($separador, $linea);

        if(count($datos)) {

          $linea = new stdClass();

          foreach($datos as $kndex => $valor) {

            if($numLinea == 0) {

              array_push($arregloEncabezados, Urls::limpiar_url(utf8_encode($valor)));

              continue;

            }

            if(isset($arregloEncabezados[$kndex])) {

              $nombreCampo = $arregloEncabezados[$kndex];

              $linea->$nombreCampo = utf8_encode($valor);

            }

          }

          array_push($arregloObjetos, $linea);

          $numLinea++;

        }

      }

      fclose($file);

      return $arregloObjetos;

    }

    return NULL;

  }



  static public

   function leerArchivoPlanoSeparado($archivo, $separador = ";") {

    $datosArchivo = array();

    if(file_exists($archivo)) {

      $lineas = file($archivo);

      foreach($lineas as $linea_num => $linea) {

        $datos = explode($separador, $linea);

        array_push($datosArchivo, $datos);

      }

      return $datosArchivo;

    }

    return NULL;

  }



  static public

   function leerArchivoTabulado($archivo) {

    $datosArchivo = array();

    if(file_exists($archivo)) {

      $lineas = file($archivo);

      foreach($lineas as $linea_num => $linea) {

        $datos = explode('\t', $linea);

        array_push($datosArchivo, $datos);

      }

      return $datosArchivo;

    }

    return NULL;

  }



  static public

    function crearArchivo($ruta, $archivo){

      self::probarCrearDirectorio($ruta);

      return fopen( $ruta.$archivo,"w+");

    }



  static public

   function escribirEnArchivo($archivo, $texto) {

    $file = fopen($archivo, "a");

    fwrite($file, "" . $texto . "" . PHP_EOL);

    fclose($file);

  }



  static public

   function escribirLog($archivo, $texto) {

    if(!file_exists(PATH_LOGS . $archivo)) {

      $file = fopen(PATH_LOGS . $archivo, "c+");

//            fwrite($file, $texto. "; " .Usuarios::mensajes_sistema() . PHP_EOL );

      fwrite($file, $texto . "; " . PHP_EOL);

      fclose($file);

    } else {

      $file = fopen(PATH_LOGS . $archivo, "r+");

      $contenido = fread($file, intval(filesize(PATH_LOGS . $archivo)));

      rewind($file);

//            fwrite($file, $texto . "; " . Usuarios::mensajes_sistema() . PHP_EOL. $contenido  );

      fwrite($file, $texto . "; " . PHP_EOL . $contenido);

      fclose($file);

    }

  }



  public static

   function probarCrearDirectorio($ruta) {   

    $ok = TRUE;

    $carpetas = explode(DS, $ruta);

    $rActual = "";

    foreach($carpetas as $carpeta) {

      $rActual .= $carpeta . DS;

      if(!is_dir($rActual)) {

        if(mkdir($rActual, 0777)) {

          $ok = FALSE;

        }

      }

    }

    return $ok;

  }



  public static

   function listarArchivosDirectorio($rutaDir, $ext = null) {



    $listado = array();

    if(is_dir($rutaDir)) {



      if($dh = opendir($rutaDir)) {

        while(($file = readdir($dh)) !== false) {

          if(!is_dir($rutaDir . $file) && $file != "." && $file != "..") {

            if(is_null($ext)) {

              $listado[] = $file;

            } else {

              $partesFile = pathinfo($file);

              if($partesFile['extension'] == $ext) {

                $listado[] = $file;

              }

            }

          }

        }

        closedir($dh);

      }

    } else {

      return null;

    }

    return $listado;

  }



  public static

   function moverArchivo($viejaUbicacion, $nuevaUbicacion, $nombreArchivo = '') {

//    echo "       ".$viejaUbicacion."     --       ". $nuevaUbicacion."               ";

    if(!rename($viejaUbicacion, $nuevaUbicacion)) {

      return false;

    }

    return true;

  }



  public static

   function moverArchivoRecibido($archivo, $rutaCarpeta, $nombreArchivo = '') {

    $dondeGuardar = $rutaCarpeta;

    if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {

      if(($archivo["type"] != "application/exe") /* && ($archivo["size"] < 8000000) */) {

        $file = ( empty($nombreArchivo) ? Archivos::limpiarCaracteresEspeciales($archivo['name']) : $nombreArchivo );

        self::probarCrearDirectorio($dondeGuardar);

        if($file && move_uploaded_file($archivo ['tmp_name'], $dondeGuardar . $file)) {

          return TRUE;

        } else {

          $error = "";

          switch($archivo['error']) {

            case UPLOAD_ERR_OK:

              break;

            case UPLOAD_ERR_NO_FILE:

              $error = ('No se ha enviado archivo.');

              break;

            case UPLOAD_ERR_PARTIAL:

              $error = ('El archivo subido fue sólo parcialmente cargado.');

              break;

            case UPLOAD_ERR_NO_TMP_DIR:

              $error = ('Falta la carpeta temporal.');

              break;

            case UPLOAD_ERR_CANT_WRITE:

              $error = ('No se pudo escribir el archivo en el disco.');

              break;

            case UPLOAD_ERR_INI_SIZE:

            case UPLOAD_ERR_FORM_SIZE:

              $error = ('Tamaño de archivo excede le permitido.');

              break;

            default:

              $error = ('Error Desconocido.');

              break;

          }

          return "<h5>Error Cargando el archivo " . $archivo ['name'] . ". " . $error . " </h5>";

        }

      } else {

        return "<h3>El archivo " . $archivo ['name'] . " excede el tamaño permitido.</h3><h5>Tamaño del Archivo: " . ($archivo["size"] / 1) . ";</h5s>";

      }

    } else {

      return "<h3>Error Procesando el archivo " . $archivo ['name'] . ".</h3>";

    }

  }



  public static

   function listarDirectoriosRutas($rutaDir) {



    $listado = array();

    if(is_dir($rutaDir)) {

      if($dh = opendir($rutaDir)) {

        while(($file = readdir($dh)) !== false) {

          $listado[] = $rutaDir . $file;

          if(is_dir($rutaDir . $file) && $file != "." && $file != "..") {

            $listado = array_merge($listado, Archivos::listar_directorios_ruta($rutaDir . $file . "/"));

          } else {

            

          }

        }

        closedir($dh);

      }

    } else {

      return null;

    }

    return $listado;

  }



  public static

   function listarDirectoriosNombre($rutaDir) {



    $listado = array();

    if(is_dir($rutaDir)) {

      if($dh = opendir($rutaDir)) {

        while(($file = readdir($dh)) !== false) {

          if(is_dir($rutaDir . $file) && $file != "." && $file != "..") {

            array_push($listado, $file);

          } else {

            

          }

        }

        closedir($dh);

      }

    } else {

      return null;

    }

    return $listado;

  }

  

  public static

    function borrar($rutaARCHIVO){

      return unlink($rutaARCHIVO);

    }

  

  

  



}
