<?php
//$Id$ 
//gen openMairie le 18/12/2020 20:07

require_once "../gen/obj/lien_id_interne_uid_externe.class.php";

class lien_id_interne_uid_externe extends lien_id_interne_uid_externe_gen {

    /**
     * @var $SQL_TEMPLATE_DOSSIER_COLLECTIVITE
     *
     * Template pour sélectionner un/des éléments de la table de lien,
     * à partir d'un numéro de dossier et d'un identifiant de collectivité.
     */
    protected $SQL_TEMPLATE_DOSSIER_COLLECTIVITE = "
        SELECT
            %s
        FROM
            ".DB_PREFIXE."dossier
            LEFT JOIN ".DB_PREFIXE."lien_id_interne_uid_externe
                ON lien_id_interne_uid_externe.object_id = dossier.dossier
                AND lien_id_interne_uid_externe.object = '%s'
        WHERE
            dossier.om_collectivite = '%s'
            AND lien_id_interne_uid_externe.external_uid = '%s'
    ";

    /**
     * @var $SQL_TEMPLATE_DOSSIER
     *
     * Template pour sélectionner un/des éléments de la table de lien,
     * à partir d'un numéro de dossier et d'un identifiant de collectivité.
     */
    protected $SQL_TEMPLATE_DOSSIER = '
        SELECT
            %2$s
        FROM
            %1$sdossier
            LEFT JOIN %1$slien_id_interne_uid_externe
                ON lien_id_interne_uid_externe.object_id = dossier.dossier
                AND lien_id_interne_uid_externe.object = \'%3$s\'
        WHERE
            lien_id_interne_uid_externe.external_uid = \'%4$s\'
    ';

    /**
     * @var $SQL_TEMPLATE_CONSULTATION
     *
     * Template pour sélectionner un/des éléments de la table de lien,
     * à partir d'un numéro de consultation et d'un identifiant de collectivité.
     */
    protected $SQL_TEMPLATE_CONSULTATION = '
        SELECT
            %2$s
        FROM
            %1$sconsultation
            LEFT JOIN %1$slien_id_interne_uid_externe
                ON lien_id_interne_uid_externe.object_id::INTEGER = consultation.consultation
                AND lien_id_interne_uid_externe.object = \'consultation\'
                AND lien_id_interne_uid_externe.dossier = \'%4$s\'
        WHERE
            lien_id_interne_uid_externe.external_uid = \'%3$s\'
    ';

    /**
     * Vérifie si la liaison existe déjà.
     *
     * @param  string  $object       Objet
     * @param  string  $object_id    Identifiant interne de l'objet
     * @param  string  $external_uid Identifiant externe de l'objet
     * @param  string  $dossier      Identifiant interne du dossier d'instruction
     *
     * @return boolean
     */
    public function is_exists($object, $object_id, $external_uid, $dossier) {
        $query = sprintf('
            SELECT COUNT(lien_id_interne_uid_externe)
            FROM %slien_id_interne_uid_externe
            WHERE object = \'%s\'
                AND object_id = \'%s\'
                AND external_uid = \'%s\'
                AND dossier = \'%s\'
            ',
            DB_PREFIXE,
            $object,
            $object_id,
            $external_uid,
            $dossier
        );
        $res = $this->f->get_one_result_from_db_query($query, true);
        if ($res['code'] === 'KO') {
            return null;
        }
        if ($res['result'] === '0') {
            return false;
        }
        return true;
    }


    /**
     * Recupère la liste complète des liens par numéro du dossier d'instruction
     *
     * @param  string $dossier identifiant du dossier d'instruction
     *
     * @return mixed           Array, sinon false en cas d'erreur
     */
    public function get_all_lien_id_interne_uid_externe_by_dossier(string $dossier, string $category = null) {
        $query = sprintf('
            SELECT *
            FROM %slien_id_interne_uid_externe
            WHERE dossier = \'%s\'
            %s
            ',
            DB_PREFIXE,
            $dossier,
            $category !== null ? sprintf(' AND category = \'%s\' ', $category) : ''
        );
        $res = $this->f->get_all_results_from_db_query($query, true);
        if ($res['code'] === 'KO') {
            return false;
        }
        return $res['result'];
    }

    /**
     * Permet de vérifier que le dossier existe à partir de son identifiant.
     * Il est nécessaire de spécifier soit l'acteur soit la collectivité
     *
     * @param string $external_uid    identifiant du dossier ou de la consultation
     * @param string $collectiviteId  identifiant de la collectivité
     * @param string $type            type d'objet pour le dossier (dossier|consultation)
     *
     * @return boolean  'true' si le dossier existe, 'false' sinon
     *
     * @throw InvalidArgumentException  si aucun acteur ni collectivité
     */
    public function dossier_exists(string $external_uid, string $collectiviteId,
                                     string $type = 'dossier') {
        if (empty($collectiviteId)) {
            throw new InvalidArgumentException(sprintf(
                __("Échec du test d'existence du dossier %s (aucun acteur / service indiqué)"),
                $external_uid));
        }
        $sql = sprintf($this->SQL_TEMPLATE_DOSSIER_COLLECTIVITE,
                       'COUNT(lien_id_interne_uid_externe.object_id)',
                       $this->f->db->escapeSimple($type),
                       $this->f->db->escapeSimple($collectiviteId),
                       $this->f->db->escapeSimple($external_uid));
        $this->f->addToLog(__METHOD__."() sql: $sql", VERBOSE_MODE);
        $count = $this->f->db->getone($sql);
        $this->f->addToLog(__METHOD__."() count: $count", VERBOSE_MODE);
        $this->f->isDatabaseError($count);
        return intval($count) != 0;
    }

    /**
     * Récupère l'identifiant openADS d'un dossier à partir de son identifiant Platau
     * Il est nécessaire de spécifier l'identifiant de la collectivité.
     *
     * @param string $external_uid    identifiant du dossier ou de la consultation
     * @param string $collectiviteId  identifiant de la collectivité
     * @param string $type                 type d'objet pour le dossier (dossier|dossier_consultation)
     *
     * @return string  le numéro de dossier trouvé, null sinon
     *
     * @throw InvalidArgumentException  si aucun acteur ni collectivité
     */
    public function get_id_dossier_from_external_uid(string $external_uid, string $collectiviteId,
                                                     string $type = 'dossier') {
        if (empty($collectiviteId)) {
            throw new InvalidArgumentException(sprintf(
                __("Échec de l'obtention du dossier %s (aucun acteur / service indiqué)"),
                $external_uid));
        }
        $sql = sprintf($this->SQL_TEMPLATE_DOSSIER_COLLECTIVITE,
                       'lien_id_interne_uid_externe.object_id',
                       $this->f->db->escapeSimple($type),
                       $this->f->db->escapeSimple($collectiviteId),
                       $this->f->db->escapeSimple($external_uid));
        $this->f->addToLog(__METHOD__."() sql: $sql", VERBOSE_MODE);
        $id_dossier = $this->f->db->getone($sql);
        $this->f->addToLog(__METHOD__."() id_dossier: $id_dossier", VERBOSE_MODE);
        $this->f->isDatabaseError($id_dossier);
        return $id_dossier;
    }

    /**
     * Récupère l'identifiant openADS d'un dossier à partir de son identifiant Platau
     *
     * @param string $external_uid    identifiant du dossier ou de la consultation
     * @param string $type                 type d'objet pour le dossier (dossier|dossier_consultation)
     *
     * @return string  le numéro de dossier trouvé, null sinon
     *
     * @throw InvalidArgumentException  si aucun acteur ni collectivité
     */
    public function get_id_dossier_from_external_uid_without_collectivite(string $external_uid, string $type = 'dossier') {
        $query = sprintf(
            $this->SQL_TEMPLATE_DOSSIER,
            DB_PREFIXE,
            'lien_id_interne_uid_externe.object_id',
            $this->f->db->escapeSimple($type),
            $this->f->db->escapeSimple($external_uid)
        );
        $this->f->addToLog(__METHOD__."() sql: $query", VERBOSE_MODE);
        $res = $this->f->get_one_result_from_db_query($query);
        $id_dossier = $res['result'];
        $this->f->addToLog(__METHOD__."() id_dossier: $id_dossier", VERBOSE_MODE);
        return $id_dossier;
    }

    /**
     * Récupère l'identifiant openADS d'une consultation à partir de son identifiant Platau
     * Il est nécessaire de spécifier l'identifiant de la collectivité.
     *
     * @param string $external_uid    identifiant de la consultation
     * @param string $dossier         identifiant du dossier d'instruction
     *
     * @return string  le numéro de la consultation trouvé, null sinon
     *
     * @throw InvalidArgumentException  si aucun acteur ni collectivité
     */
    public function get_id_consultation_from_external_uid(string $external_uid, string $dossier) {
        $query = sprintf(
            $this->SQL_TEMPLATE_CONSULTATION,
            DB_PREFIXE,
            'lien_id_interne_uid_externe.object_id',
            $this->f->db->escapeSimple($external_uid),
            $this->f->db->escapeSimple($dossier)
        );
        $this->f->addToLog(__METHOD__."() sql: $query", VERBOSE_MODE);
        $res = $this->f->get_one_result_from_db_query($query);
        $id_consultation = $res['result'];
        $this->f->addToLog(__METHOD__."() id_consultation: $id_consultation", VERBOSE_MODE);
        return $id_consultation;
    }
}
