<?php

/**
 * Cette classe permet de gérer l'upload de fichier vers le poste client
 */
class Fichier
{

    /**
     * Fonction qui construit l'URL de téléchargement de fichiers
     * Si les trois paramètres sont vides, c'est que les valeurs sont
     * passées par les varaiables de session
     *
     * string $EmplacementFichier : pj (répertoire pièces jointes), tmp (répertoire tmp) ou chr (cherche dans les deux précédents)
     * string $UrlFichier : chemin du fichier dans l'emplacement précédent
     * string $NomFichier : nom du fichier pour l'utilisateur
     *
     * retour $message string : l'URL à utiliser
     */
    public static function GetURL($EmplacementFichier = '', $UrlFichier = '', $NomFichier = '', $index = null)
    {
        $param = '?uniq=' . uniqid();
        
        // if (stripos($_SERVER['HTTP_USER_AGENT'], 'MSIE 8') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false) {
        //$param .= '&' . session_name() . '=' . session_id();
        // }
        if ($EmplacementFichier !== '') {
            if ($param !== '')
                $param .= '&';
            $param .= 'EmplacementFichier=' . htmlentities(urlencode(str_replace("\\", '/', $EmplacementFichier)));
        }
        if ($UrlFichier !== '') {
            if ($param !== '')
                $param .= '&';
            $param .= 'UrlFichier=' . htmlentities(urlencode(str_replace("\\", '/', $UrlFichier)));
        }
        if ($NomFichier !== '') {
            if ($param !== '')
                $param .= '&';
            $param .= 'NomFichier=' . htmlentities(urlencode($NomFichier));
        }
        if (! is_null($index)) {
            if ($param !== '')
                $param .= '&';
            $param .= 'CacheImp=' . $index;
        }

        
        $param .= '&token=' . password_hash($_SESSION['Session_Login'].session_id() , PASSWORD_DEFAULT);
        
        return 'charge_document.php' . $param;
    }

    /**
     * Fonction statique qui permet d'envoyer un fichier au client
     *
     * string $cheminFichier : chemin complet du fichier sur le serveur
     *
     * retour $message : éventuellement un message d'erreur
     */
    public static function &UploadClient($cheminFichier, $nomFichier)
    {
        $message = '';
        // $fileinfo = '';
        if ($_SESSION['user_is_logged'] === true) {
            
            if (function_exists('apache_request_headers')) {
                $init = apache_request_headers();
                
                $request = '';
                foreach ($init as $index => & $element)
                    if ($index == 'Accept' || $index == 'Accept-Encoding' || $index == 'Accept-Language' || $index == 'Cache-Control' || $index == 'User-Agent' || $index == 'Host')
                        $request .= $index . ': ' . $element . "\r\n";
            } else
                $request = '';
            
            // Lecture des header http
            $context = stream_context_create(array(
                'http' => array(
                    'method' => 'GET',
                    'header' => $request
                )
            ));
            
            // $name = "http://bristol/oxadata2/fic_pj/25308636.xls";
            // $name = 'http://bristol/oxadata2/fic_pj/0002/08924906.pdf';
            // $name = 'http://bristol/oxadata2/fic_pj/0002/08924906.docx';
            
            $agent = $_SERVER['HTTP_USER_AGENT'];
            $indice = stripos($agent, 'MSIE ');
            $ieSpecifique = false;
            if ($indice > 0) {
                $versionNavigateur = trim(substr($agent, $indice + 5, 2), ';');
                if ($versionNavigateur < 9)
                    $ieSpecifique = true;
            }
            
            $name = $cheminFichier;
            // $nameBase = substr($name, strrpos($name,'/')+1);
            
            if(strpos('https', $name ?? ''))
            {
                fsockopen();
            }
            if ($fp = @fopen($name, 'r', false, $context)) {
                header_remove();
                
                // indispensable sinon le download ne s'active pas pour les fichiers au-delà de 30 octets
                ini_set('zlib.output_compression', 'Off');
                $header = stream_get_meta_data($fp);
                
                $modePdf = false;
                
                foreach ($header['wrapper_data'] as & $element) {
                    if ($element == 'Content-Type: application/pdf')
                        $modePdf = true;
                    
                    if ($modePdf || ! $ieSpecifique)
                        header($element);
                    else if (stripos($agent, 'Content-Type:') === 0) {
                        header('Content-Type: application/x-download');
                    } else
                        header($element);
                }
                
                /**
                 * Pour IE et Edge
                 */
                 
                if(strtolower(end(explode('.',$nomFichier))) == 'html' || strtolower(end(explode('.',$nomFichier))) == 'htm')
                {
                    header('Content-Type: text/html');
                } else if (strtolower(end(explode('.',$nomFichier))) == 'pdf' && !$ieSpecifique)
                {
                    header('Content-Type: application/pdf');
                } else {
                    header('Content-Type: application/x-download');
                }

                header('Content-Disposition: inline; filename="' . rawurlencode(urlencode($nomFichier)) . '";');
                echo stream_get_contents($fp);
                ob_flush();
                flush();
            }
            
            exit();
        } else {
            $message = 'Veuillez vous reconnecter avant de télécharger un fichier.';
        }
        return $message;
    }

    /**
     * Retourne le répertoire de base des pièces jointes
     */
    public static function &getCheminPJ()
    {
        return $_SESSION['chemin_pj'];
    }

    /**
     * Retourne le répertoire de base des pièces jointes
     */
    public static function &getCheminWeb()
    {
        return $_SESSION['chemin_pj'];
    }

    /**
     * Retourne le répertoire de base des pièces jointes
     */
    public static function &getCheminTmp()
    {
        return $_SESSION['dir_tmp'];
    }
  /**
     * creation fichier dans TMP
     * @param string $fileName  : nom du fichier
     * @param string $content   : contenu du fichier
     */
    public static function createFichierTmp($fileName, $content)
    {
        if ($fp = fopen($_SESSION['dir_tmp'].$fileName, "w+")) {
            fputs($fp, $content);
            fclose($fp);
        }
    }
    /**
     * Retourne l'extension de répertoire liée à l'utilisateur et crée l'arborescence
     * si elle n'existe pas
     */
    public static function &getExtensionCheminPJ()
    {
        $extension = $_SESSION['id_user'] . '/' . $_SESSION['id_panier'] . '/' . date('Ymd', time()) . '/';
        $file_dir = Fichier::getCheminPJ() . $extension;
        
        $tmp_dir = '';
        foreach (explode('/', $file_dir) as $element) {
            $tmp_dir .= $element;
            if (! is_dir($tmp_dir))
                @mkdir($tmp_dir);
            $tmp_dir .= '/';
        }
        
        return $extension;
    }

    /**
     * Si la chaine envoyée en paramètre n'est pas vide, supprime le fichier correspondant
     */
    public static function Supprimer($cheminFichier)
    {
        if ($cheminFichier !== '') {
            @unlink($cheminFichier);
        }
    }

    public static function LireContenuFichier($chemin_fichier, $parseXml = false)
    {
        $resultat = NULL;
        
        $icpt = 0;
        while (! file_exists($chemin_fichier)) {
            usleep(600); // Attente de 200 milliseconds (synchronisation UNC / systeme NAS et autre
            $icpt ++;
            if ($icpt > 10)
                break;
        }
        
        if(strpos('https', $chemin_fichier))
        {
            fsockopen();
        }
        
        
        $fichier = fopen($chemin_fichier, 'r');
        if ($fichier) {
            while (($str = fgets($fichier)) !== false)
                $resultat .= $str;
            
            fclose($fichier);
            if ($parseXml)
                $resultat = SopaClientOxa::xmlstr_to_array($resultat);
        }
        
        return $resultat;
    }
}
