<?php /** @noinspection SqlResolve */
/** @noinspection SqlNoDataSourceInspection */

/**
 * Magic Method Support
 * @property array notifType
 * @property array cacheNotifIcon
 * @method void comment_post(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1])
 * @method void add_comment_photo(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1])
 * @method void comment_photo(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1])
 * @method void comment_tracker(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1, 'text' => ''])
 * @method void add_friend(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1])
 * @method void friend(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1])
 * @method void gift(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1])
 * @method void blog(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1, 'text' => ''])
 * @method void blog_otvet(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1, 'text' => ''])
 * @method void arbour(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1, 'text' => ''])
 *
 * @method void like_arbour(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1, 'text' => ''])
 * @method void like_photo(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1, 'text' => ''])
 * @method void like_photocom(array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1, 'text' => ''])
 */

class notif
{
    private $notifType = [];
    private $cacheNotifIcon = [];

    /**
     * @var notif
     */
    private static $objectClassNotif;

    /**
     * notif constructor.
     */
    private function __construct()
    {
        /**
         * Добавляем список типов уведомлений
         * а так-же иконку типа уведомления.
         * Ключем массива является название типа уведомления,
         * а значение этого название селектора иконки.
         * Пример использования:
         * notif::init()->comment_tracker([
             'id_author' => 'кому посылаем',
             'id_user' => 'от кого посылаем',
             'id_post' => 'id записи',
             'text' => 'текст сообщения'
         * ]);
         * notif::init()->comment_post([
             'id_author' => 'кому посылаем',
             'id_user' => 'от кого посылаем',
             'id_post' => 'id записи'
         * ]);
         */
        $this->notifType ['comment_post'] = 'icon_notify_mini_comment'; // комментирование записи
        $this->notifType ['add_comment_photo'] = 'icon_notify_mini_photo_tag';// оставил коммент к фото
        $this->notifType ['comment_photo'] = 'icon_notify_mini_repost'; // ответил на коммент к фото
        $this->notifType ['comment_tracker'] = 'icon_notify_mini_interesting'; // ответ баг трекере
        $this->notifType ['add_friend'] = 'icon_notify_mini_friend_accepted'; //  добавили в друзья
        $this->notifType ['no_friend'] = 'icon_notify_mini_error'; //  отменили заявку в друзья
        $this->notifType ['friend'] = 'icon_notify_mini_follow'; // заявка в друзья
        $this->notifType ['gift'] = 'icon_notify_mini_gift'; // сделали подарок
        $this->notifType ['blog'] = 'icon_notify_mini_wall'; // комментарии к блогу
        $this->notifType ['blog_otvet'] = 'icon_notify_mini_repost'; // ответ на комментраий к блогу
        $this->notifType ['arbour'] = 'icon_notify_mini_repost'; // ответ на комментраий в общем чате

        $this->notifType ['like_arbour'] = 'icon_notify_mini_like';
        $this->notifType ['like_photo'] = 'icon_notify_mini_like';
        $this->notifType ['like_photocom'] = 'icon_notify_mini_like';
    }

    /**
     * @param array $args
     * @return bool|array
     */
    private function filterParams(array $args)
    {
        $paramsFilter = [
            'filter' => FILTER_CALLBACK,
            'options' => function ($args) {
                return (int)$args;
            }
        ];

        $args = filter_var_array($args, [
            'id_user' => $paramsFilter,
            'id_author' => $paramsFilter,
            'id_post' => $paramsFilter,
            'text' => FILTER_DEFAULT
        ], false);

        if (!isset($args['id_user']) ||
            !isset($args['id_author']) ||
            !isset($args['id_post'])) {
            return false;
        }

        if (!isset($args['text']))
            $args['text'] = '';

        return $args;
    }

    /**
     * @return notif
     */
    public static function init()
    {
        if ((self::$objectClassNotif instanceof self) === false) {
            self::$objectClassNotif = new static();
        }
        return self::$objectClassNotif;
    }


    /**
     * @param string $name
     * @param array $args
     * @return bool
     */
    public function __call($name, array $args)
    {
        $args = $this->filterParams(array_shift($args));

        if ($args === false) return false;

        if (array_key_exists($name, $this->notifType) === false) return false;
        if($args['id_author'] === $args['id_user']) return true;
        DB:: $pdo->query(
            'INSERT INTO `notices` 
                  (`id_user`, `id_last`, `time`, `type`, `id_obj`, `read`, `count`, `notices_text`) 
                  VALUES (?, ?, ?, ?, ?, ?, ?, ?);',
            [
                $args['id_author'], $args['id_user'],
                time(), $name,
                $args['id_post'], 0, 1,
                $args['text']
            ]
        );
        return true;
    }

    /**
     * @param $type
     * @param array $args = ['id_author' => -1, 'id_user' => -1, 'id_post' => -1]
     * @return bool
     */
    public function deleteNotif($type, array $args)
    {

        $args = $this->filterParams($args);

        if ($args === false) return false;

        if (array_key_exists($type, $this->notifType) === false) return false;

        DB::$pdo->query(
            'DELETE FROM `notices` 
                      WHERE `id_obj` = :id_obj AND `id_user` = :id_user 
                        AND `id_last` = :id_last AND `type` = :type',
            [
                ':id_obj' => $args['id_post'],
                ':id_last' => $args['id_user'],
                ':id_user' => $args['id_author'],
                ':type' => $type
            ]);
        return true;
    }

    /**
     * <p>Определяем иконку уведомления в
     * зависимости от типа уведомления</p>
     * @param $notifType
     * @return string
     */
    public function getTypeIcon($notifType)
    {
        if (array_key_exists($notifType, $this->cacheNotifIcon) === false) {
            if ($notifType === 'error_post') {
                $this->cacheNotifIcon[$notifType] = 'icon_notify_mini_error';
            } else {
                if (array_key_exists($notifType, $this->notifType) === true) {
                    $this->cacheNotifIcon[$notifType] = $this->notifType[$notifType];
                } else {
                    $this->cacheNotifIcon[$notifType] = 'icon_notify_mini_private_post';
                }
            }
        }
        return $this->cacheNotifIcon[$notifType];
    }
}