<?php

/**
 * This file defines the queue manager class.
 *
 * @package CGMessageQuery
 * @category async
 * @author calguy1000 <calguy1000@cmsmadesimple.org>
 * @copyright Copyright 2015 by Robert Campbell
 */
namespace CGMessageQueue;


/**
 * The Queue Manager class handles interacting with the queue.
 * This is a singleton object.
 *
 * @package CGMessageQuery
 * @category async
 * @author calguy1000 <calguy1000@cmsmadesimple.org>
 * @copyright Copyright 2015 by Robert Campbell
 */
class QueueManager
{
    /**
     * @ignore
     */
    private static $_instance;

    /**
     * @ignore
     */
    private function __construct() {}

    /**
     * Get a reference to the only instance of this object.
     *
     * @return QueueManager
     */
    public static function &get_instance()
    {
        if( !self::$_instance ) self::$_instance = new self();
        return self::$_instance;
    }

    /**
     * @ignore
     */
    public static function table_name()
    {
        return cms_db_prefix().'mod_cgmessagequeue';
    }

    /**
     * Get the metadata for a message from the specified queue.
     * This method does not pop the message out of the queue.
     *
     * @param string $queue The queue name
     */
    public function &get_meta($queue)
    {
        $queue = trim($queue);
        if( !$queue ) throw new \LogicException('Please specify a queue name to '.__METHOD__);

        $obj = null;
        $db = \cge_utils::get_db();
        $sql = 'SELECT id,queue,module,data,created,expires FROM '.self::table_name().' WHERE queue = ? AND (expires IS NULL OR expires > NOW()) ORDER BY id';
        $row = $db->GetRow($sql,array($queue));
        if( !is_array($row) ) return $obj;

        $obj = new MessageMetadata($row);
        return $obj;
    }

    /**
     * Place a message on the queue for asynchronous processing.
     *
     * @param MessageBase $msg The message object.
     */
    public function send(MessageBase $msg)
    {
        $meta = new MessageMetadata($msg);
        $meta->save();
    }

    /**
     * Get the name of the queue associated with the first message in the database.
     * If there are no messages in the database an empty string will be returned.
     *
     * @return string.
     */
    public function get_first_queue()
    {
        $db = \cge_utils::get_db();
        $sql = 'SELECT queue FROM '.self::table_name().' ORDER BY id';
        $queue = $db->GetOne($sql);
        return $queue;
    }

    /**
     * @ignore
     */
    public function clean_expired()
    {
        $db = \cge_utils::get_db();
        $sql = 'DELETE FROM '.self::table_name().' WHERE expires < NOW()';
        $db->Execute();
    }
}
