<?php

include("GnutecaWebServices.class.php");

class gnuteca3WebServicesNotifications
{

    private $webService;
    private $MIOLO;
    private $busMyLibrary;

    public function __construct()
    {
        $this->MIOLO = MIOLO::getInstance();
        $this->webService = new GWebServices();
        $this->busMyLibrary = $this->MIOLO->getBusiness('gnuteca3', 'BusMyLibrary');
    }

    /**
     * Lista as notificações do usuário.
     * @param string $clientId
     * @param string $clientPassword
     * @param int $personId
     * @return string JSON encoded response
     */
    public function listUserNotification($clientId, $clientPassword, $personId)
    {
        $retorno = new stdClass();

        // Define acesso ao método e define a classe do Webservice
        $this->webService->__setClient($clientId, $clientPassword);
        $this->webService->setClassName(get_class($this));

        // Verifica se o usuário possui acesso ao WebService
        if (!$this->webService->__checkMethod("listUserNotification", false)) 
        {
            $retorno->message = $this->webService->__getErrorStr();
            return json_encode($retorno);
        }

        $userMyLibraryData = (object) [
            "personId" => $personId,
            "visible" => true,
        ];

        $this->busMyLibrary->setData($userMyLibraryData);
        $userMyLibrary = $this->busMyLibrary->searchMyLibrary(true, null, null, 'date DESC');

        $notifications = array_map([self::class, 'classifyMessage'], $userMyLibrary);
        $retorno->notifications = $notifications;

        if (empty($retorno->notifications)) 
        {
            $retorno->message = "Não foi encontrada nenhuma notifcação.";
            $retorno->notifications = false;
        }

        return json_encode($retorno);
    }

    /**
     * Classifica a mensagem de notificação entre os tipos: return, delay.
     * @param object $notification
     * @return object Objeto com as propriedades: notificationId, type, message, date.
     */
    private static function classifyMessage($notification)
    {
        $resultado = (object) [
            'notificationId' => $notification->myLibraryId,
            'type' => null,
            'message' => null,
            'date' => GUtil::extractDateFromTimestamp($notification->date),
        ];

        /**
         * No momento em que esta função foi criada, não havia uma maneira de classificar
         * as mensagens de notificação, então foi necessário analisar o conteúdo da mensagem
         * para determinar o tipo de notificação.
         */
        if (
            strpos($notification->message, 'devolveu')
            && preg_match('/Título:\s*(.*?)\s*Autor:/', $notification->message, $matches)
        ) {
            $resultado->type = "return";
            $resultado->message = trim(strip_tags($matches[1]));
        }

        if (strpos($notification->message, 'atraso')) 
        {
            $resultado->type = "delay";
            $resultado->message = "materiais em atraso";
        }

        return $resultado;
    }

    /**
     * Remove uma notificação do usuário (Não a exclui, apenas torna invisível).
     * @param string $clientId
     * @param string $clientPassword
     * @param int $personId
     * @param int $notificationId
     * @return string JSON encoded response
     */
    public function removeUserNotification($clientId, $clientPassword, $personId, $notificationId)
    {
        $retorno = new stdClass();

        // Define acesso ao método e define a classe do Webservice
        $this->webService->__setClient($clientId, $clientPassword);
        $this->webService->setClassName(get_class($this));

        // Verifica se o usuário possui acesso ao WebService
        if (!$this->webService->__checkMethod("removeUserNotification", false)) 
        {
            $retorno->message = $this->webService->__getErrorStr();
            return json_encode($retorno);
        }

        $return = $this->busMyLibrary->setUserMyLibraryVisibility($personId, $notificationId, 'false');

        $retorno->return = $return;
        return json_encode($retorno);
    }
}
