<?php

class ActionScheduler_QueueCleaner
{
    protected $batch_size;
    private $store = null;
    private $month_in_seconds = 2678400;
    public function __construct(ActionScheduler_Store $store = null, $batch_size = 20)
    {
        $this->store = $store ? $store : ActionScheduler_Store::instance();
        $this->batch_size = $batch_size;
    }
    public function delete_old_actions()
    {
        $lifespan = apply_filters('action_scheduler_retention_period', $this->month_in_seconds);
        $cutoff = as_get_datetime_object($lifespan . ' seconds ago');
        $statuses_to_purge = array(ActionScheduler_Store::STATUS_COMPLETE, ActionScheduler_Store::STATUS_CANCELED);
        foreach ($statuses_to_purge as $status) {
            $actions_to_delete = $this->store->query_actions(array('status' => $status, 'modified' => $cutoff, 'modified_compare' => '<=', 'per_page' => $this->get_batch_size(), 'orderby' => 'none'));
            foreach ($actions_to_delete as $action_id) {
                try {
                    $this->store->delete_action($action_id);
                } catch (Exception $e) {
                    do_action('action_scheduler_failed_old_action_deletion', $action_id, $e, $lifespan, count($actions_to_delete));
                }
            }
        }
    }
    public function reset_timeouts($time_limit = 300)
    {
        $timeout = apply_filters('action_scheduler_timeout_period', $time_limit);
        if ($timeout < 0) {
            return;
        }
        $cutoff = as_get_datetime_object($timeout . ' seconds ago');
        $actions_to_reset = $this->store->query_actions(array('status' => ActionScheduler_Store::STATUS_PENDING, 'modified' => $cutoff, 'modified_compare' => '<=', 'claimed' => true, 'per_page' => $this->get_batch_size(), 'orderby' => 'none'));
        foreach ($actions_to_reset as $action_id) {
            $this->store->unclaim_action($action_id);
            do_action('action_scheduler_reset_action', $action_id);
        }
    }
    public function mark_failures($time_limit = 300)
    {
        $timeout = apply_filters('action_scheduler_failure_period', $time_limit);
        if ($timeout < 0) {
            return;
        }
        $cutoff = as_get_datetime_object($timeout . ' seconds ago');
        $actions_to_reset = $this->store->query_actions(array('status' => ActionScheduler_Store::STATUS_RUNNING, 'modified' => $cutoff, 'modified_compare' => '<=', 'per_page' => $this->get_batch_size(), 'orderby' => 'none'));
        foreach ($actions_to_reset as $action_id) {
            $this->store->mark_failure($action_id);
            do_action('action_scheduler_failed_action', $action_id, $timeout);
        }
    }
    public function clean($time_limit = 300)
    {
        $this->delete_old_actions();
        $this->reset_timeouts($time_limit);
        $this->mark_failures($time_limit);
    }
    protected function get_batch_size()
    {
        return absint(apply_filters('action_scheduler_cleanup_batch_size', $this->batch_size));
    }
}