<?php
/**
 * Ce script définit la classe 'change_linked_users'.
 *
 * @package openads
 * @version SVN : $Id$
 */

require_once PATH_OPENMAIRIE."om_base.class.php";

/**
 * Définition de la classe 'change_linked_users' (om_base).
 */
class change_linked_users extends om_base {

    /**
     *
     */
    var $action = ".";

    /**
     *
     */
    var $om_utilisateur = array();

    /**
     *
     */
    var $champ = 'om_utilisateur_linked';

    /**
     * Constructeur.
     *
     * @return void
     */
    public function __construct($action = ".") {
        $this->init_om_application();
        $this->action = $action;
        $this->list_linked_users();
        $this->f->log(__METHOD__, "linked users :".var_export($this->om_utilisateur, true), 'DEBUG', 'auth');
    }

    /**
     * Validation du formulaire.
     *
     * @return void
     */
    public function validateForm () {
        if (isset($_POST['change_linked_users_action_cancel']) === true) {
            $this->f->goToDashboard();
        }
        if (isset($_POST[$this->champ]) === true
            && isset($_POST['change_linked_users_action_valid']) === true) {
            if (! isset($this->om_utilisateur[$_POST[$this->champ]])) {
                $this->f->displayMessage('error',
                    sprintf(__("Utilisateur lié '%s' (identifiant) invalide."), $_POST[$this->champ]));
                die();
            }
            $_POST['login'] = $this->om_utilisateur[$_POST[$this->champ]]['login'];
            $_POST['password'] = $this->om_utilisateur[$_POST[$this->champ]]['pwd'];
            $_POST['login_action_connect'] = true;
            $this->f->set_submitted_value();
            $this->f->log(__METHOD__, "set POST['login']: ".var_export($_POST['login'], true), 'DEBUG', 'auth');
            $this->f->log(__METHOD__, "set POST['password']: ".var_export(substr($_POST['password'], 0, 3).'...', true), 'DEBUG', 'auth');
            $this->f->log(__METHOD__, "set POST['login_action_connect']: ".var_export($_POST['login_action_connect'], true), 'DEBUG', 'auth');
            $this->f->login_linked_users();
        }
    }

    /**
     * Liste des utilisateurs liés à l'utilisateur connecté.
     *
     * @return array
     */
    public function get_linked_users () {
        return $this->om_utilisateur;
    }

    /**
     * Récupère la liste des utilisateurs liés à l'utilisateur connecté.
     *
     * @return void
     */
    public function list_linked_users() {
        $qres = $this->f->get_all_results_from_db_query(
            // Utilisateur connecté
            // + utilisateurs liés à l'utilisateur connecté
            // + utilisateur principal de l'utilisateur connecté
            // + utilisateurs liés à l'utilisateur principal de l'utilisateur connecté
            sprintf('
                SELECT
                    *
                FROM
                    %1$som_utilisateur
                WHERE
                    login = \'%2$s\'
                UNION
                SELECT
                    omu_linked.*
                FROM
                    %1$som_utilisateur
                LEFT JOIN %1$slien_om_utilisateur_om_utilisateur
                    ON om_utilisateur.om_utilisateur = lien_om_utilisateur_om_utilisateur.om_utilisateur
                LEFT JOIN %1$som_utilisateur as omu_linked
                    ON omu_linked.om_utilisateur = lien_om_utilisateur_om_utilisateur.om_utilisateur_lie
                WHERE om_utilisateur.login = \'%2$s\'
                    AND omu_linked.om_type = \'%3$s\'
                UNION
                SELECT
                    omu_princ.*
                FROM
                    %1$som_utilisateur
                LEFT JOIN %1$slien_om_utilisateur_om_utilisateur
                    ON om_utilisateur.om_utilisateur = lien_om_utilisateur_om_utilisateur.om_utilisateur_lie
                LEFT JOIN %1$som_utilisateur as omu_princ
                    ON omu_princ.om_utilisateur = lien_om_utilisateur_om_utilisateur.om_utilisateur
                WHERE om_utilisateur.login = \'%2$s\'
                    AND omu_princ.om_type != \'%3$s\'
                UNION
                SELECT
                    omu_linked.*
                FROM
                    %1$som_utilisateur
                LEFT JOIN %1$slien_om_utilisateur_om_utilisateur
                    ON om_utilisateur.om_utilisateur = lien_om_utilisateur_om_utilisateur.om_utilisateur_lie
                LEFT JOIN %1$som_utilisateur as omu_princ
                    ON omu_princ.om_utilisateur = lien_om_utilisateur_om_utilisateur.om_utilisateur
                LEFT JOIN %1$slien_om_utilisateur_om_utilisateur as lien_omu_omu_princ
                    ON omu_princ.om_utilisateur = lien_omu_omu_princ.om_utilisateur
                LEFT JOIN %1$som_utilisateur as omu_linked
                    ON omu_linked.om_utilisateur = lien_omu_omu_princ.om_utilisateur_lie
                WHERE om_utilisateur.login = \'%2$s\'
                    AND omu_linked.om_type = \'%3$s\'
                ',
                DB_PREFIXE,
                $this->f->escape_string_for_db_query($_SESSION['login']),
                'linked'
            ),
            array(
                "origin" => __METHOD__,
            )
        );
        // Tri le résultat pour avoir toujours l'utilisateur connecté en premier
        // choix de la liste
        // Puis le reste trié par ordre croissant
        usort($qres['result'], function($a, $b) {
            if ($a["login"] === $_SESSION['login']) {
                return -1;
            } elseif ($b["login"] === $_SESSION['login']) {
                return 1;
            } else {
                return strcmp($a["login"], $b["login"]);
            }
        });
        foreach ($qres['result'] as $user) {
            $this->om_utilisateur[$user['om_utilisateur']] = $user;
        }
    }

    /**
     * Affiche le formulaire pour changer d'utilisateur.
     *
     * @param  boolean $full Affiche le formulaire complet.
     * @return void
     */
    public function showForm ($full = true) {
        // Gestion d'un tabindex sur les champs du formulaire
        $tabindex = 1;
        //
        printf("\n<div id=\"change_linked_usersform\" class=\"formulaire\">\n");
        //
        $this->f->layout->display__form_container__begin(array(
            'id' => 'change_linked_users_form',
            'action' => $this->action,
        ));
        //
        $this->f->layout->display_formulaire_conteneur_libelle_widget('select');
        //
        $this->f->layout->display_formulaire_conteneur_libelle_champs();
        //
        printf(
            "\t\t<label for=\"%s\">%s</label>\n",
            $this->champ,
            __("Se connecter avec l'utilisateur")
        );
        $this->f->layout->display_formulaire_fin_conteneur_champs();
        //
        $this->f->layout->display_formulaire_conteneur_champs();
        //
        printf(
            "\t\t<select name=\"%s\" id=\"%s\" tabindex=\"%s\" size=\"1\" class=\"champFormulaire\" >\n\t\t\t",
            $this->champ,
            $this->champ,
            $tabindex++
        );
        foreach ($this->get_linked_users() as $value) {
            printf(
                "<option value=\"%s\"",
                $value['om_utilisateur']
            );
            if ($_SESSION["login"] == $value['login']) {
                printf(" selected=\"selected\"");
            }
            printf(
                ">%s</option>",
                $value['login']
            );
        }
        printf("\n\t\t</select>\n");
        //
        $this->f->layout->display_formulaire_fin_conteneur_champs();
        //
        $this->f->layout->display_formulaire_fin_conteneur_champs();
        //
        $this->f->layout->display__form_controls_container__begin(array(
            "controls" => "bottom",
        ));
        $this->f->layout->display_form_button(array(
            'id' => 'change_linked_users_action_valid',
            'value' => __('Valider'),
            'name' => 'change_linked_users.action.valid',
            'class' => 'boutonFormulaire context',
            'tabindex' => $tabindex++,
        ));
        if ($full == true) {
            $this->f->layout->display_form_retour(array(
                'id' => 'form-action-change_linked_users-back-'.uniqid(),
                'href' => OM_ROUTE_DASHBOARD,
            ));
        }
        //
        $this->f->layout->display__form_controls_container__end();
        //
        $this->f->layout->display__form_container__end();
        //
        printf("</div>\n");
    }
}


