<?php

namespace Helpers\ChargeDocument;

use Helpers\Fichier\Fichier;
use Helpers\Outil\Outils;
use Helpers\Session\ParseBase1;

// ini_set('session.use_trans_sid', '1');
// ini_set('session.use_cookies', '0');
// ini_set('session.use_only_cookies', '0');


class ChargeDocument
{

    public function __construct()
    {
    }

    public function chargeDoc(
        \PDO $pdo,
        string $urlFichier,
        string $EmplacementFichier,
        bool $affichageImage = false
    ) :?string {

        $message = '';

        // if (! is_null(getValue('CacheImp'))) {
        //     $liste = unserialize($_SESSION['cache_imp']);
        //     $index = getValue('CacheImp');
            
        //     $urlFichier = $liste[$index]['UrlFichier'];
        //     $EmplacementFichier = $liste[$index]['EmplacementFichier'];
        // } else
        $EmplacementFichier = ($EmplacementFichier != '') ? $EmplacementFichier: '';
        if (!empty($urlFichier)) {
            $urlFichier = urldecode(html_entity_decode($urlFichier));
            $NomFichier = (array_key_exists('NomFichier', $_GET)) ? urldecode(html_entity_decode($_GET['NomFichier'])) : '';
        } else {
            // TODO : ???
            $urlFichier = ($urlFichier != '') ? $urlFichier : '';
            
            
            $NomFichier = array_key_exists('NomFichier', $_SESSION) ? $_SESSION['NomFichier'] : '';
            
            // unset($_SESSION['UrlFichier']);
            // unset($_SESSION['EmplacementFichier']);
            // unset($_SESSION['NomFichier']);
        }
        
        if ($NomFichier == '') {
            $liste = explode('/', str_replace('\\', '/', $urlFichier));
            $NomFichier = $liste[count($liste) - 1];
        }
           
        // création du contexte
        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
            )
        ));
        // fin de la création du contexte


        if ($urlFichier == '') {
            return null;
        }
        if ($EmplacementFichier === 'cata') {
            $urlFichier = (new ParseBase1())->getRep()->oxadata.$urlFichier;
        } elseif ($EmplacementFichier === 'web') {
            // Le fichier est dans le répertoire des pièces jointes
            $urlFichier = Fichier::filterTraversal((new ParseBase1())->getPath()->oxadataWeb, $urlFichier);
        } elseif ($EmplacementFichier === 'pj') {
            // Le fichier est dans le répertoire des pièces jointes
            $urlFichier = Fichier::filterTraversal((new ParseBase1())->getRep()->pj, $urlFichier);
        } elseif ($EmplacementFichier === 'tmp') {
            // Le fichier est dans le répertoire temporaire
            $urlFichier = Fichier::filterTraversal((new ParseBase1())->getRep()->tmp, $urlFichier);
        } elseif ($EmplacementFichier === 'chr') {
            // Le fichier doit être cherché : il vient d'être ajouté par exemple en tant que doc rattaché,
            // il est enregistré dans le répertoire des pj mais n'est vraiment présent que dans le répertoire temporaire
            $urlFichierTmp = Fichier::filterTraversal((new ParseBase1())->getRep()->pj, $urlFichier);
            if (file_exists($urlFichierTmp)) {
                $urlFichier = $urlFichierTmp;
            } else {
                $urlFichierTmp = Fichier::filterTraversal((new ParseBase1())->getRep()->tmp, $urlFichier);

                if (file_exists($urlFichierTmp)) {
                    $urlFichier = $urlFichierTmp;
                } else {
                    $urlFichier = basename($urlFichier);
                    $urlFichierTmp = Fichier::filterTraversal((new ParseBase1())->getRep()->pj, $urlFichier);
                    if (file_exists($urlFichierTmp)) {
                        $urlFichier = $urlFichierTmp;
                    } else {
                        $urlFichier = Fichier::filterTraversal((new ParseBase1())->getRep()->tmp, $urlFichier);
                    }
                }
            }
        } elseif ($EmplacementFichier === 'img') {
            // Le fichier est dans le répertoire temporaire
            $urlFichier = Fichier::filterTraversal((new ParseBase1())->getRep()->images, $urlFichier);
        } elseif ((strpos(strtoupper(trim($urlFichier)), 'HTTP://') === 0
            || strpos(strtoupper(trim($urlFichier)), 'HTTPS://') === 0
            || strpos(strtoupper(trim($urlFichier)), 'WWW.') === 0
            )
            && strpos(strtoupper(trim($urlFichier)), 'MGRQISPI.DLL') !== false) {
          // $NomFichier = '';
        } else {
            return null;
        }

        if (strpos($urlFichier, 'ispi.dll') === false) {
            if ($EmplacementFichier === 'web') {
            } elseif ($EmplacementFichier == 'cata') {
            } elseif (strpos(strtoupper($urlFichier), strtoupper((new ParseBase1())->getRep()->pj)) === 0) {
            } elseif (strpos($urlFichier, (new ParseBase1())->getRep()->tmp) === 0) {
                if (fopen(Fichier::filterTraversal((new ParseBase1())->getRep()->tmp, substr($urlFichier, strlen((new ParseBase1())->getRep()->tmp))), 'r', false, $context)) {
                    $urlFichier = Fichier::filterTraversal((new ParseBase1())->getRep()->tmp, substr($urlFichier, strlen((new ParseBase1())->getRep()->tmp)));
                }
            } else {
                $baseRepertoire = rtrim((new ParseBase1())->getRep()->pj . '\\', '\\'); // Correspondant au tag du base1.ini : tmp ex E:\Oxalys2\Oxadata\tmp\
                /** @phpstan-ignore-next-line */
                $baseRepertoire = substr($baseRepertoire, 0, strrpos($baseRepertoire, '\\')); // Correspondant au tag du base1.ini : tmpweb ex http://OREL/oxadata2/tmp/
                
                $baseHttp = rtrim((new ParseBase1())->getRep()->tmp . '/', '/');
                /** @phpstan-ignore-next-line */
                $baseHttp = substr($baseHttp, 0, strrpos($baseHttp, '/'));
                
                $urlFichier = $baseHttp . str_replace('\\', '/', substr($urlFichier, strlen($baseRepertoire)));
            }

            if ($affichageImage) {
                return $urlFichier;
            }

            $message = $this->UploadClient($urlFichier, $NomFichier);
        } else {
            $message = $this->UploadClient($urlFichier, $NomFichier);
        }

        
        if ($message !== '') {
            echo $message;
        }
        return null;
    }
    /**
     * 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
     * @param mixed $cheminFichier
     * @param mixed $nomFichier
     * @return string
     */
    // phpcs:ignore
    public 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 ?? '')) {
                /** @phpstan-ignore-next-line */
                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;

                // si $name est un chemin absolu, $header['wrapper_data'] n'existe pas et il faut gérer l'extension autrement
                $i = 0;
                
                foreach ($header['wrapper_data']??[] as & $element) {
                    if ($element == 'Content-Type: application/pdf') {
                        $modePdf = true;
                    }
                    
                    if ($modePdf || ! $ieSpecifique) {
                        header($element);
                    } elseif (stripos($agent, 'Content-Type:') === 0) {
                        header('Content-Type: application/x-download');
                    } else {
                        header($element);
                    }
                    $i++;
                }
                
                if ($i == 0) {
                    Outils::getHeaderByFile($name);
                }
                
                header('Content-Disposition: inline; filename="' . rawurlencode(urlencode($nomFichier)) . '";');
                
                echo stream_get_contents($fp);
                ob_flush();
                flush();
            }
        } else {
            $message = 'Veuillez vous reconnecter avant de télécharger un fichier.';
        }
        return $message;
    }
}
