<?php

/**
 * @defgroup scheduledTask Scheduled Tasks
 * Implements a scheduled task mechanism allowing for the periodic execution
 * of maintenance tasks, notification, etc.
 */

/**
 * @file classes/scheduledTask/ScheduledTaskDAO.php
 *
 * Copyright (c) 2014-2021 Simon Fraser University
 * Copyright (c) 2000-2021 John Willinsky
 * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
 *
 * @class ScheduledTaskDAO
 *
 * @ingroup scheduledTask
 *
 * @see ScheduledTask
 *
 * @brief Operations for retrieving and modifying Scheduled Task data.
 */

namespace PKP\scheduledTask;

class ScheduledTaskDAO extends \PKP\db\DAO
{
    /**
     * Get the last time a scheduled task was executed.
     *
     * @param string $className
     *
     * @return int
     */
    public function getLastRunTime($className)
    {
        $result = $this->retrieve(
            'SELECT last_run FROM scheduled_tasks WHERE class_name = ?',
            [$className]
        );
        $row = $result->current();
        return $row && $row->last_run ? strtotime($this->datetimeFromDB($row->last_run)) : 0;
    }

    /**
     * Update a scheduled task's last run time.
     *
     * @param string $className
     * @param int $timestamp optional, if omitted the current time is used.
     *
     * @return int
     */
    public function updateLastRunTime($className, $timestamp = null)
    {
        $result = $this->retrieve('SELECT COUNT(*) AS row_count FROM scheduled_tasks WHERE class_name = ?', [$className]);

        $row = $result->current();
        if ($row && $row->row_count != 0) {
            if (isset($timestamp)) {
                return $this->update('UPDATE scheduled_tasks SET last_run = ' . $this->datetimeToDB($timestamp) . ' WHERE class_name = ?', [$className]);
            }
            return $this->update('UPDATE scheduled_tasks SET last_run = NOW() WHERE class_name = ?', [$className]);
        } else {
            if (isset($timestamp)) {
                return $this->update(
                    sprintf('INSERT INTO scheduled_tasks (class_name, last_run) VALUES (?, %s)', $this->datetimeToDB($timestamp)),
                    [$className]
                );
            }
            return $this->update('INSERT INTO scheduled_tasks (class_name, last_run) VALUES (?, NOW())', [$className]);
        }
    }
}

if (!PKP_STRICT_MODE) {
    class_alias('\PKP\scheduledTask\ScheduledTaskDAO', '\ScheduledTaskDAO');
}
