<?php

namespace Helpers\Session;

use Helpers\Session\Enums\MenuTopEnum;

/**
 * @deprecated a ne plus utiliser
 */
class Session
{
    private string $nomSession;

    /** Permet la gestion des variables de session pour les créations et modification des modules
     *  @param 'FournisseurSimplie'|'Fournisseur'|'ValidationFacture' $nomSession : le nom du module (ex: Fournisseur)
     *  @param string $Mode : définir si on est en édition/création/autre?
     */
    public function __construct(string $nomSession, string $Mode = '')
    {
        if (!in_array($nomSession, ['FournisseurSimplie', 'Fournisseur', 'ValidationFacture'])) {
            throw new \Exception('Invalid code "' . $nomSession . '"');
        }
        $this->nomSession = $nomSession;

        if (!isset($_SESSION[$this->nomSession])) {
            $_SESSION[$this->nomSession] = [];
        }

        if ($Mode) {
            $_SESSION[$this->nomSession]['mode'] = $Mode;
        }
    }

    /* setter session */
    public function setSession(string $sousTableau, mixed $value): void
    {
        $_SESSION[$this->nomSession][$sousTableau] = $value;
    }

    public function setErreurValidation(string $erreur): void
    {
        $_SESSION[$this->nomSession]['ErreurValid'] = $erreur;
    }

    public function setErreurWsdl(string $erreur): void
    {
        $_SESSION[$this->nomSession]['ErreurXml'] = $erreur;
    }


    /* suppresion session */
    public function suppresionSession(): void
    {
        unset($_SESSION[$this->nomSession]);
    }

    public function suppresionLigneSession(string $sousTableau): void
    {
        unset($_SESSION[$this->nomSession][$sousTableau]);
    }

    public function suppresionErreurSession(): void
    {
        unset($_SESSION[$this->nomSession]['ErreurValid']);
        unset($_SESSION[$this->nomSession]['ErreurXml']);
    }

    /* getter session */
    public function getSession(string $sousTableau = ''): mixed
    {
        if ($sousTableau) {
            return $_SESSION[$this->nomSession][$sousTableau] ?? '';
        } else {
            return $_SESSION[$this->nomSession];
        }
    }

    /**
     * @return array<mixed>
     */
    public function getSessionArray(string $sousTableau): mixed
    {
        return $_SESSION[$this->nomSession][$sousTableau] ?? [];
    }

    public function getErreurValidation(): string
    {
        return $_SESSION[$this->nomSession]['ErreurValid'] ?? '';
    }

    public function getErreurWsdl(): mixed
    {
        return $_SESSION[$this->nomSession]['ErreurXml'] ?? '';
    }

    public function getMode(): string
    {
        return $_SESSION[$this->nomSession]['mode'] ?? '';
    }

    public static function sessionExist(string $nomSession): bool
    {
        return array_key_exists($nomSession, $_SESSION);
    }

    public static function backToFrs(bool $isSimplifie = false): bool
    {
        $session = new Session($isSimplifie ? 'FournisseurSimplie' : 'Fournisseur');
        return $session->getSession($isSimplifie ? 'FournisseurSimplie' : 'Fournisseur') && $session->getSession('searchImport') != true;
    }

    /**
     * initSession
     *
     * @return void
     */
    public static function initSession()
    {
        if (\Helpers\Outil\Roles::GetAllDev()) {
            error_reporting(E_ALL & ~E_DEPRECATED & ~E_WARNING & ~E_NOTICE);
            ini_set('display_errors', '1');
        }
    }

    /**
     * initSession
     *
     * @return void
     */
    public static function initSessionActive(): void
    {
        if (session_status() != PHP_SESSION_ACTIVE) {
            session_name('__OxaProc-PHPSESSID');
            session_start();
        }
    }
    
    /**
     * generateFileHeaderSessionForTransfert
     *
     * @return array<mixed>
     */
    public static function generateFileHeaderSessionForTransfert(bool $stringOnly = false): array|string
    {
        if ($stringOnly) {
            $cookieHeader = '';
        } else {
            $cookieHeader = 'Cookie: ';
        }

        $cookiePairs = [];
        foreach ($_COOKIE as $key => $value) {
            $cookiePairs[] = $key . '=' . $value;
        }

        $cookieHeader .= implode('; ', $cookiePairs);

        if ($stringOnly) {
            return $cookieHeader;
        }

        return [$cookieHeader];
    }

    /**
     * Summary of setSessionTypeMenuTop
     * @param ?MenuTopEnum $typeMenu
     * Si null, "P2P"  par défault
     * @param bool $menuTopAccueil
     * @return void
     */
    public static function setSessionTypeMenuTop(?MenuTopEnum $typeMenu = null, bool $menuTopAccueil = false): void
    {
        if ($typeMenu === null) {
            $typeMenu = MenuTopEnum::P2P;
        }

        $_SESSION['typeMenu'] = [
            'value'                 => $typeMenu->value,
            'menuTopAccueil'  => $menuTopAccueil
        ];
    }

    /**
     * Summary of getSessionTypeMenuTop
     * Ne doit pas être utilisé pour effectuer des comparaisons
     * @return MenuTopEnum
     */
    public static function getSessionTypeMenuTop(): MenuTopEnum
    {
        if (!isset($_SESSION['typeMenu'])) {
            return MenuTopEnum::P2P;
        }
        $_SESSION['typeMenu']['menuTopAccueil'] = false;
        return MenuTopEnum::from($_SESSION['typeMenu']['value']);
    }

    /**
     * Summary of verifySessionTypeMenuTop
     * @param ?MenuTopEnum $typeMenu
     * Ne pas utiliser MenuTopEnum::from pour ne pas faire planter l'appli
     * @return bool
     */
    public static function verifySessionTypeMenuTop(?MenuTopEnum $typeMenu): bool
    {
        if ($typeMenu === null) {
            return false;
        }
        if (($_SESSION['typeMenu']['menuTopAccueil'] ?? false) == true) {
            return true;
        }
        return ($_SESSION['typeMenu']['value'] ?? '') == $typeMenu->value;
    }

    /**
     * Summary of getSessionTypeMenuTop
     * @deprecated Ne pas utiliser - uniquement pour ConnexionService
     * @return MenuTopEnum
     */
    public static function getSessionTypeMenuTopConnexionService(): ?MenuTopEnum
    {
        return MenuTopEnum::tryFrom($_SESSION['typeMenu']['value'] ?? '') ?? MenuTopEnum::P2P;
    }
}
