<?php

namespace Helpers\Ariane;

class Ariane
{
    
    //reset la session du fil d'ariane
    public static function init() :void
    {
        unset($_SESSION['ariane']);
        unset($_SESSION['navigation']);
    }
    
    /**
     *
     * @param int $niveau           - la position de l'onglet (0 etant le 1er onglet, 99xxx le dernier)
     * @param string $titre         - le titre de l'onglet
     * @param array<mixed> $post           - les post envoyez (permet de récuperé les filtes lorsque l'on clique sur l'onglet)
     * @param int $nombreLigne      - Nombre d'éléments récupèrent (essentiellement pour les gestions afin d'afficher le nombre de résultat de la recherche).
     * @param string $path          - path de l'onglet par defaut $_SERVER['REQUEST_URI']
     */
    public static function generate(
        int $niveau,
        string $titre,
        array $post = [],
        ?int $nombreLigne = null,
        $path = null,
        bool $hidden = false
    ) :void {
        if (isset($_SESSION['ariane']['last']) && $niveau <= $_SESSION['ariane']['last'] && isset($_SESSION['ariane'])) {
            for ($i=$niveau; $i <= (int)($_SESSION['ariane']['last'] ?? 0); $i++) {
                if (isset($_SESSION['ariane'][$i])) {
                    unset($_SESSION['ariane'][$i]);
                }
            }
        }
        
        if ($path != null) {
            $pathSession = $path;
        } else {
            $pathSession = $_SERVER['REQUEST_URI'];
        }
        $_SESSION['ariane']['last'] = $niveau;
        // $_SESSION['ariane']['pile'][] = $niveau;
        $_SESSION['ariane']['path'] =$_SERVER['REQUEST_URI'];
        $_SESSION['ariane'][$niveau]['path']=$pathSession;
        $_SESSION['ariane'][$niveau]['niveau']=$niveau;
        $_SESSION['ariane'][$niveau]['titre']=$titre;
        $_SESSION['ariane'][$niveau]['post']=$post;
        $_SESSION['ariane'][$niveau]['hidden'] = $hidden;
        
        if (isset($_SESSION['bulleSousFiltre'])) {
            $_SESSION['ariane'][$niveau]['bulleSousFiltre']=$_SESSION['bulleSousFiltre'];
        }
        
        if (isset($_SESSION['bulleFiltre'])) {
            $_SESSION['ariane'][$niveau]['bulleFiltre']=$_SESSION['bulleFiltre'];
        }
        
        if ($nombreLigne) {
            $_SESSION['ariane'][$niveau]['nombre']=$nombreLigne;
        }
    }

    public static function hasLevel(int $level) :bool
    {
        return !empty($_SESSION['ariane'][ $level ]);
    }

    /**
     * fonction permettant lors d'un retour sur un écran de suivi/gestion, de mettre un focus sur le document précédemment ouvert
     * La session est vidé a chaque fois que {{ onFocus() }} est appeler afin d'éviter le focus sur le document a chaque rafraichisement, il ne le fera que la 1ere foi
     * Afin d'éviter les conflits en cas de navigation dans un sous document on ne rafraichira pas la session si celle-ci existe
     *
     * @param string $idFocus
     * @return void
     */
    public static function setFocus(string $idFocus) : void
    {
        $pathFocus = $_SESSION['ariane'][0]['path'];
        if ($idFocus && (empty($_SESSION['focus'][$pathFocus]))) {
            $_SESSION['focus'][$pathFocus] = $idFocus;
        }
    }
    
    public static function getBackPath(bool $backStart = false) :?string
    {
        if ($backStart) {
            $ariane = $_SESSION['ariane'][0]??[];
        } elseif ($_SESSION['ariane']['last'] == 0) {
            $ariane = $_SESSION['ariane'][$_SESSION['ariane']['last']]??[];
        } else {
            for ($i = 1; $i<=$_SESSION['ariane']['last']; $i++) {
                if (isset($_SESSION['ariane'][$_SESSION['ariane']['last']-$i])) {
                    $ariane = $_SESSION['ariane'][$_SESSION['ariane']['last']-$i];
                    break;
                }
            }
        }
        
        return $ariane['path']??null;
    }

    /**
     * @return mixed
     */
    public static function getBackPost(bool $backStart = false)
    {
        $ariane = null;

        if ($backStart) {
            $ariane = $_SESSION['ariane'][0]??[];
        } elseif ($_SESSION['ariane']['last'] == 0) {
            $ariane = $_SESSION['ariane'][$_SESSION['ariane']['last']]??[];
        } else {
            for ($i = 1; $i<=$_SESSION['ariane']['last']; $i++) {
                if (isset($_SESSION['ariane'][$_SESSION['ariane']['last']-$i])) {
                    $ariane = $_SESSION['ariane'][$_SESSION['ariane']['last']-$i];
                    break;
                }
            }
        }
        
        return $ariane['post']??null;
    }
    
    /**
     * @param array<mixed> $post
     * @param mixed $place
     * @param mixed $active
     * @return void
     */
    public static function generateFuture(int $niveau, string $titre, array $post = [], ?int $nombreLigne = null, $place = 0, $active = 0)
    {
        

        
        if (isset($_SESSION['ariane']['last']) && $niveau <= $_SESSION['ariane']['last'] && isset($_SESSION['ariane'])) {
            for ($i=$niveau; $i <= (int)($_SESSION['ariane']['last'] ?? 0); $i++) {
                if (isset($_SESSION['ariane'][$i]) && $i > $niveau) {
                    unset($_SESSION['ariane'][$i]);
                }
            }
        }
        
        $array = [
            'path' => $_SERVER['REQUEST_URI'],
            'niveau' => $niveau,
            'titre' => $titre,
            'post' => $post,
            'place' => $place,
            'active' => $active,
        ];

        if ($nombreLigne) {
            $array['nombre']=$nombreLigne;
        }

        
        if (isset($_SESSION['bulleSousFiltre'])) {
            $array['bulleSousFiltre']=$_SESSION['bulleSousFiltre'];
        }

        
        if (isset($_SESSION['bulleFiltre'])) {
            $array['bulleFiltre']=$_SESSION['bulleFiltre'];
        }

        $_SESSION['ariane'][$niveau][$place]=$array;
        
        
        $_SESSION['ariane']['last'] = $niveau;
        $_SESSION['ariane']['active'] = $place;
        
        // if($active)
        // {
        //     $_SESSION['ariane']['titre'] = $titre;
        //     $_SESSION['ariane']['active'] = $place;
        // }

    
        
        // $_SESSION['ariane']['last'] = $niveau;
        // $_SESSION['ariane'][$niveau]['path']=$_SERVER['REQUEST_URI'];
        // $_SESSION['ariane'][$niveau]['niveau']=$niveau;
        // $_SESSION['ariane'][$niveau]['titre']=$titre;
        // $_SESSION['ariane'][$niveau]['post']=$post;
        
        
        // unset($_SESSION['ariane']);
    }
    
    /**
     * getPostArianArray
     *
     * @return array<mixed>
     */
    public static function getPostArianArray(): ?array
    {
        $arrayFiltre = [];
        $_SESSION['ariane']['noinit'] = 0;
        if (($_SESSION['ariane']['path'] ?? '') != $_SERVER['REQUEST_URI']) {
            foreach (($_SESSION['ariane'] ?? [] ) as $ariane) {
                if (is_array($ariane) && isset($ariane['path']) && $ariane['path'] == $_SERVER['REQUEST_URI']) {
                    $arrayFiltre = $ariane['post'];
                    $_SESSION['ariane']['noinit'] = 1;
                }
            }
        }
        return $arrayFiltre;
    }

    public static function clearFocus() : void
    {
        unset($_SESSION['focus']);
    }
}
