<?php

class DOA_Categorie
{

    const id_FORMULAIRE = 'FORMULAIRE_CATEGORIE';

    const id_ID_PARENT = 'ID_PARENT';

    const id_LIB = 'LIB';

    const id_DESCR = 'DESCR';

    const id_ID_CAT = 'ID';

    const id_NUM_ORDRE = 'NUM_ORDRE';

    /**
     *
     * @param unknown $TYPE_OBJET
     * @param unknown $ID_OBJET
     * @param unknown $typeAction
     * @param unknown $ID_CAT
     * @return unknown
     */
    static function &BuildXmlListeCategorie($TYPE_OBJET, $ID_OBJET, $typeAction, $ID_CAT)
    {
        $array = null;
        $ID_DONNE = null;
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        
        if (! is_null($ID_CAT) && $ID_CAT != '' && ($reqSql = (SqlDoaReferentiel::rqGetCategorie($TYPE_OBJET, $ID_OBJET, $ID_CAT)->TrouveTous()))) {
            foreach ($reqSql as & $value) {
                $element = DOA_Categorie::getDonneeCategorie($value['ID'], $TYPE_OBJET, $ID_OBJET);
                $ID_DONNE = $element['ID_DONNEE'];
                
                $array[] = array(
                    '!TYPE_OBJET' => $value['TYPE_OBJET'],
                    '!ID_OBJET' => $value['ID_OBJET'],
                    'ID' => array(
                        '!value' => ($typeAction == 'ajout' ? '' : $value['ID']),
                        '!id' => DOA_Categorie::id_ID_CAT
                    ),
                    'ID_PARENT' => array(
                        '!value' => $value['ID_PARENT'],
                        '!id' => DOA_Categorie::id_ID_PARENT
                    ),
                    'LIB' => array(
                        '!value' => ($typeAction == 'ajout' ? '' : $value['LIB']),
                        '!id' => DOA_Categorie::id_LIB
                    ),
                    'DESCR' => array(
                        '!value' => ($typeAction == 'ajout' ? '' : $value['DESCR']),
                        '!id' => DOA_Categorie::id_DESCR
                    ),
                    'NUM_ORDRE' => array(
                        '!value' => ($typeAction == 'ajout' ? '' : $value['NUM_ORDRE']),
                        '!id' => DOA_Categorie::id_NUM_ORDRE
                    ),
                    '!ID_DONNEE' => ($ID_DONNE == null) ? '' : $ID_DONNE
                );
            }
        } else {
            $array[] = array(
                'ID' => array(
                    '!id' => DOA_Categorie::id_ID_CAT
                ),
                'ID_PARENT' => array(
                    '!id' => DOA_Categorie::id_ID_PARENT
                ),
                'LIB' => array(
                    '!id' => DOA_Categorie::id_LIB
                ),
                'DESCR' => array(
                    '!id' => DOA_Categorie::id_DESCR
                ),
                'NUM_ORDRE' => array(
                    '!id' => DOA_Categorie::id_NUM_ORDRE
                ),
                '!ID_DONNEE' => ($ID_DONNE == null) ? '' : $ID_DONNE
            );
        }
        $array['ide']['fiche']['FORMULAIRE'] = array(
            '!id' => DOA_Categorie::id_FORMULAIRE,
            '!onclickAjout' => 'TraiteAsync(\'DOA_Bibliotheque.php?action=EnregistrerCategorie&type=ajout\',document.forms[\'' . DOA_Categorie::id_FORMULAIRE . '\'].elements[0],\'\',\'' . cnv_to_javascript(trad('Enregistrement des information...')) . '\');',
            '!onclickModif' => 'TraiteAsync(\'DOA_Bibliotheque.php?action=EnregistrerCategorie&type=modif\',document.forms[\'' . DOA_Categorie::id_FORMULAIRE . '\'].elements[0],\'\',\'' . cnv_to_javascript(trad('Enregistrement des information...')) . '\');'
        );
        $array['ide']['fiche']['TYPE_ACTION'] = $typeAction;
        
        return $array;
    }

    public static function &BuildXmlListeCategoriePere($typeAction, $idCatOrigine, $TYPE_OBJET, $ID_OBJET)
    {
        $array = null;
        
        if ($typeAction == 'modif') {
            if ($element = DOA_Categorie::getDonneeCategorie($idCatOrigine, $TYPE_OBJET, $ID_OBJET))
                $dataExiste = true;
            else
                $dataExiste = false;
        } else {
            $dataExiste = false;
        }
        DOA_Categorie::constructArboCat($typeAction, $idCatOrigine, $dataExiste, $TYPE_OBJET, $ID_OBJET, 0, $array, 1);
        return $array;
    }

    /**
     *
     * @param unknown $typeAction
     * @param unknown $idCatOrigine
     * @param unknown $dataExiste
     * @param unknown $TYPE_OBJET
     * @param unknown $ID_OBJET
     * @param unknown $idParent
     * @param unknown $array
     * @param number $decal
     */
    public static function constructArboCat($typeAction, $idCatOrigine, $dataExiste, $TYPE_OBJET, $ID_OBJET, $idParent, & $array, $decal = 0)
    {
        if ($reqSql = SqlDoaReferentiel::rqGetSqlDoaCategorieFille($TYPE_OBJET, $ID_OBJET, $idParent)->TrouveTous()) {
            foreach ($reqSql as & $value) {
                
                if (! is_null($idCatOrigine) && $value['ID'] == $idCatOrigine)
                    $ID_DONNEE = '';
                else {
                    $element = DOA_Categorie::getDonneeCategorie($value['ID'], $TYPE_OBJET, $ID_OBJET);
                    $ID_DONNEE = $element['ID_DONNEE'];
                }
                $array[] = array(
                    '!TYPE_OBJET' => $value['TYPE_OBJET'],
                    '!ID_OBJET' => $value['ID_OBJET'],
                    'ID' => array(
                        '!value' => $value['ID'],
                        '!id' => DOA_Categorie::id_ID_CAT
                    ),
                    'ID_PARENT' => array(
                        '!value' => $value['ID_PARENT'],
                        '!id' => DOA_Categorie::id_ID_PARENT
                    ),
                    'LIB' => array(
                        '!value' => str_repeat("- ", $decal) . $value['LIB'],
                        '!id' => DOA_Categorie::id_LIB
                    ),
                    'DESCR' => array(
                        '!value' => $value['DESCR'],
                        '!id' => DOA_Categorie::id_DESCR
                    ),
                    'NUM_ORDRE' => array(
                        '!value' => $value['NUM_ORDRE'],
                        '!id' => DOA_Categorie::id_NUM_ORDRE
                    ),
                    '!ID_DONNEE' => ($ID_DONNEE == null) ? '' : $ID_DONNEE
                );
                
                DOA_Categorie::constructArboCat($typeAction, $idCatOrigine, $dataExiste, $TYPE_OBJET, $ID_OBJET, $value['ID'], $array, $decal + 2);
            }
        }
    }

    public static function getCategorieNode($TYPE_OBJET, $ID_OBJET, $ID_PARENT)
    {
        $reqSqlCategorieNode = SqlDoaReferentiel::rqGetCategorieNode($TYPE_OBJET, $ID_OBJET, $ID_PARENT)->Trouve1();
        return $reqSqlCategorieNode['LIB'];
    }

    public static function getDonneeCategorie($ID_CAT, & $TYPE_OBJET, & $ID_OBJET)
    {
        return SqlDoaReferentiel::rqGetDonneeCategorie($ID_CAT, $TYPE_OBJET, $ID_OBJET)->Trouve1();
    }

    public static function &VerifieUniciteLibelle(& $TYPE_OBJET, & $ID_OBJET, &$LIB, &$ID_PARENT)
    {
        $reqSql = SqlDoaReferentiel::rqDOA_VerifieUniciteLibDoar($TYPE_OBJET, $ID_OBJET, $LIB, $ID_PARENT)->Trouve1();
        return $reqSql['nb'];
    }

    /**
     * Fonction donnant le dernier numéro d'une filiation d'une catégorie
     * 
     * @param unknown $TYPE_OBJET
     * @param unknown $ID_OBJET
     * @param unknown $ID_PARENT
     * @return Ambigous <>|number
     */
    public static function getLastNumOrdre($TYPE_OBJET, $ID_OBJET, $ID_PARENT)
    {
        if ($reqSql = SqlDoaReferentiel::rqGetLastNumOrdre($TYPE_OBJET, $ID_OBJET, $ID_PARENT)->Trouve1()) {
            return $reqSql['NUM_ORDRE'];
        }
        return 0;
    }

    static function EnregistrerCategorie($typeAction)
    {
        $messageErreur = '';
        $clSession = DoaBibSession::getSession();
        $TYPE_OBJET = $clSession->getTypeObject();
        $ID_OBJET = $clSession->getIdObject();
        $LIB = trim(GetValue(DOA_Categorie::id_LIB));
        $DESCR = trim(getValue(DOA_Categorie::id_DESCR));
        $ID_PARENT = trim(GetValue(DOA_Categorie::id_ID_PARENT)); // ID du noeud choisi
        $NUM_ORDRE = 0;
        $ID_CAT = trim(GetValue(DOA_Categorie::id_ID_CAT)); // ID du noeud à déplacer
        
        if ($LIB == '') {
            $messageErreur = 'Veuillez renseigner une catégorie';
        }
        if (mb_strlen($LIB) > 120) {
            $messageErreur = 'La catégorie doit être inférieur à 120 caractères';
        }
        if (mb_strlen($DESCR) > 3000) {
            $messageErreur = 'La description doit être inférieur à 3000 caractères';
        }
        if (DOA_Categorie::VerifieUniciteLibelle($TYPE_OBJET, $ID_OBJET, $LIB, $ID_PARENT) != 0 && $typeAction == 'ajout') {
            $messageErreur = 'La catégorie existe déjà pour ce niveau';
        }
        
        $NUM_ORDRE = DOA_Categorie::getLastNumOrdre($TYPE_OBJET, $ID_OBJET, $ID_PARENT) + 1;
        
        if ($typeAction == 'ajout') {
            if ('' === $messageErreur) {
                if (! SqlDoaReferentiel::rqDOA_AjouteCategorie($TYPE_OBJET, $ID_OBJET, $ID_PARENT, $LIB, $DESCR, $NUM_ORDRE)->ExecuteSql())
                    $messageErreur = Trad('Une erreur est survenue pendant l\'enregistrement de la catégorie.');
            }
        }
        if ($typeAction == 'modif') {
            
            if (DOA_Categorie::CatFilleCategorie($TYPE_OBJET, $ID_OBJET, $ID_CAT, $ID_PARENT)) {
                $messageErreur = 'Vous ne pouvez pas choisir une fille de cette catégorie';
            }
            
            if ('' === $messageErreur) {
                if (! SqlDoaReferentiel::rqDOA_MajCategorie($TYPE_OBJET, $ID_OBJET, $ID_PARENT, $LIB, $DESCR, $NUM_ORDRE, $ID_CAT)->ExecuteSql())
                    $messageErreur = Trad('Une erreur est survenue pendant la modification de la catégorie.');
            }
        }
        
        return array(
            'messageErreur' => $messageErreur
        );
    }

    /**
     *
     * @param unknown $TYPE_OBJET
     * @param unknown $ID_OBJET
     * @param unknown $id
     * @return boolean
     */
    public static function SupprimerCategorie($TYPE_OBJET, $ID_OBJET, $id)
    {
        $SqlListe = new PileSql(DB_OXASQLDB);
        
        /**
         * Suppression de l'ensemble des données lié à la catégorie
         */
        if ($listeDonnee = SqlDoaBibliotheque::rqDOA_GetListeDonnee($TYPE_OBJET, $ID_OBJET, $id)->TrouveTous())
            foreach ($listeDonnee as & $donnee)
                DOA_Struct::SupprimerDonnee($SqlListe, $donnee['TYPE_OBJET'], $donnee['ID_OBJET'], $donnee['ID_DONNEE']);
        
        // Supprimercategorie
        $SqlListe->AddRequeteSql(SqlDoaReferentiel::rqDOA_SupprimerCategorie($TYPE_OBJET, $ID_OBJET, $id));
        
        if ($SqlListe->Commit())
            $messageErreur = '';
        else
            $messageErreur = trad('Veuillez renseigner une catégorie');
        
        return array(
            'messageErreur' => $messageErreur
        );
    }

    /**
     * Fonction permettant de savoir si un ID_CAT cible est dans la branche de l'ID_CAT source (fonction récursive)
     * 
     * @param unknown $TYPE_OBJET
     * @param unknown $ID_OBJET
     * @param unknown $ID_CAT_Source
     * @param unknown $ID_CAT_Cible
     * @return boolean
     */
    public static function CatFilleCategorie($TYPE_OBJET, $ID_OBJET, $ID_CAT_Source, $ID_CAT_Cible)
    {
        $rqSql = SqlDoaReferentiel::rqDOAGetInfosCategorie($ID_CAT_Cible, $TYPE_OBJET, $ID_OBJET)->Trouve1();
        
        if ($rqSql['ID_PARENT'] == $ID_CAT_Source) {
            return true;
        } else {
            if ($rqSql['ID_PARENT'] == 0) {
                return false;
            } else {
                return DOA_Categorie::CatFilleCategorie($TYPE_OBJET, $ID_OBJET, $ID_CAT_Source, $rqSql['ID_PARENT']);
            }
        }
    }
}