<?php

if (!function_exists('init_files_config')) {

    /**
     * Configuración inicial que necesita la libreria de upload files
     * @access public
     * @param string $CI instancia de codeiniter
     * @param string $path Nombre de la carpeta donde se subirá los archivos
     * @param string $name Nombre que tendrá el archivo
     * @param string $allowed_types tipos de archivos que acepta la carga de subida de archivos
     * @param boolean $overwrite si se necesita sobreescribir los archivos
     * @return array
     */
    function init_files_config($CI, $path, $name, $allowed_types, $overwrite) {
        $config['upload_path'] = $path;
        $config['file_name'] = $name;
        $config['allowed_types'] = $allowed_types;
        $config['remove_spaces'] = TRUE;
        $config['max_size'] = $CI->config->item('FILE_MAX_SIZE');
        $config['max_width'] = $CI->config->item('FILE_MAX_WIDTH');
        $config['max_height'] = $CI->config->item('FILE_MAX_HEIGHT');
        $config['overwrite'] = $overwrite;
        return $config;
    }

}
if (!function_exists('upload_file')) {

    /**
     * Subida de un archivo
     * @access public
     * @param string $path Nombre de la carpeta donde se subirá los archivos
     * @param string $name Nombre del archivo que se subirá 
     * @param string $name_field_form Nombre del campo $_FILES donde se encuentra el archivo
     * @param string $allowed_types tipos de archivos que acepta la carga de subida de archivos
     * @param boolean $overwrite si se necesita sobreescribir los archivos
     * @return array (path, filename)
     */
    function upload_file($path, $name, $name_field_form, $allowed_types = "pdf", $overwrite = FALSE) {
        if (!file_exists($path)) {
            throw new Exception("ERROR: Directorio inexistente (" . $path . "), por favor contacte a soporte técnico");
        }
        $CI = &get_instance();
        unset($config);
        $config = init_files_config($CI, $path, $name, $allowed_types, $overwrite);
        $CI->load->library('upload');
        $CI->upload->initialize($config);
        if ($CI->upload->do_upload($name_field_form)) {
            return array("path" => $path, "filename" => $name . "." . get_file_extension($_FILES[$name_field_form]['name']));
        } else {
            $errors = $CI->upload->display_errors(', ', '');
            throw new Exception(substr($errors, 2));
        }
    }

}

if (!function_exists('upload_multiple_files')) {

    /**
     * Subida de archivos multiples
     * @access public
     * @param string $path Nombre de la carpeta donde se subirá los archivos
     * @param array[strings] $array_name Arreglo de nombres de los archivos que se subirán debe tener la misma longitud que el arreglo de archivos y ordenados conforme al array multiple
     * @param string $name_field_array_files Nombre de la posicion del arreglo asociativo $_FILES donde se encuentra el arreglo multiple de archivos
     * @param string $allowed_types tipos de archivos que acepta la carga de subida de archivos
     * @param boolean $overwrite si se necesita sobreescribir los archivos
     * @return array
     */
    function upload_multiple_files($path, $array_name, $name_field_array_files, $allowed_types = "pdf", $overwrite = FALSE) {
        if (!file_exists($path)) {
            throw new Exception("ERROR: Directorio inexistente (" . $path . "), por favor contacte a soporte técnico");
        }
        $name_field_upload = 'multiple_files_aux';
        $CI = &get_instance();
        $CI->load->library('upload');
        $count_files = count($_FILES[$name_field_array_files]['name']);
        $count_name = count($array_name);
        if ($count_name !== $count_files) {
            throw new Exception("Error: La longitud del arreglo 'nombres' no es igual a la longitud del arreglo 'multiple', por favor contacte a soporte técnico");
        }
        $uploaded_files = [];
        for ($i = 0; $i < $count_files; $i++) {
            $_FILES[$name_field_upload]['name'] = $_FILES[$name_field_array_files]['name'][$i];
            $_FILES[$name_field_upload]['type'] = $_FILES[$name_field_array_files]['type'][$i];
            $_FILES[$name_field_upload]['tmp_name'] = $_FILES[$name_field_array_files]['tmp_name'][$i];
            $_FILES[$name_field_upload]['error'] = $_FILES[$name_field_array_files]['error'][$i];
            $_FILES[$name_field_upload]['size'] = $_FILES[$name_field_array_files]['size'][$i];
            unset($config);
            $config = init_files_config($CI, $path, $array_name[$i], $allowed_types, $overwrite);
            $CI->upload->initialize($config);
            if ($CI->upload->do_upload($name_field_upload)) {
                $uploaded_files[] = array("path" => $path, "filename" => $array_name[$i], "extension" => "." . get_file_extension($_FILES[$name_field_array_files]['name'][$i]));
            } else {
                $errors = $CI->upload->display_errors(', ', '');
                throw new Exception(substr($errors, 2));
            }
        }
        return $uploaded_files;
    }

}

if (!function_exists('get_file_extension')) {

    function get_file_extension($file_name) {
        $array_file_name = explode('.', $file_name);
        $extension = end($array_file_name);
        return $extension;
    }

}

if (!function_exists('remove_file')) {

    function remove_file($path, $filename) {
        if (substr($path, -1) == '/') {
            $path = substr($path, 0, -1);
        }
        $path .= '/';
        if (file_exists($path . $filename)) {
            unlink($path . $filename);
        } else {
            throw new Exception("ERROR: Archivo inexistente (" . $path . $filename . "), por favor contacte a soporte técnico");
        }
    }

}
//if (!function_exists('rename_file')) {
//
//    function rename_file($path, $old_name, $new_name) {
//        $result['success'] = true;
//        if (file_exists($path . $old_name)) {
//            if (!rename($path . $old_name, $path . $new_name)) {
//                $result['success'] = false;
//                $result['errors'] = "error al renombrar archivo " . $old_name;
//            }
//        }
//        if (!$result['success']) {
//            $CI = &get_instance();
//            $CI->response(['message' => $result['errors']], REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
//        }
//    }
//
//}