<?php
namespace Cron;
if (!defined('ABSPATH')) exit;
abstract class AbstractField implements FieldInterface
{
 public function isSatisfied($dateValue, $value)
 {
 if ($this->isIncrementsOfRanges($value)) {
 return $this->isInIncrementsOfRanges($dateValue, $value);
 } elseif ($this->isRange($value)) {
 return $this->isInRange($dateValue, $value);
 }
 return $value == '*' || $dateValue == $value;
 }
 public function isRange($value)
 {
 return strpos($value, '-') !== false;
 }
 public function isIncrementsOfRanges($value)
 {
 return strpos($value, '/') !== false;
 }
 public function isInRange($dateValue, $value)
 {
 $parts = array_map('trim', explode('-', $value, 2));
 return $dateValue >= $parts[0] && $dateValue <= $parts[1];
 }
 public function isInIncrementsOfRanges($dateValue, $value)
 {
 $parts = array_map('trim', explode('/', $value, 2));
 $stepSize = isset($parts[1]) ? (int) $parts[1] : 0;
 if ($stepSize === 0) {
 return false;
 }
 if (($parts[0] == '*' || $parts[0] === '0')) {
 return (int) $dateValue % $stepSize == 0;
 }
 $range = explode('-', $parts[0], 2);
 $offset = $range[0];
 $to = isset($range[1]) ? $range[1] : $dateValue;
 // Ensure that the date value is within the range
 if ($dateValue < $offset || $dateValue > $to) {
 return false;
 }
 if ($dateValue > $offset && 0 === $stepSize) {
 return false;
 }
 for ($i = $offset; $i <= $to; $i+= $stepSize) {
 if ($i == $dateValue) {
 return true;
 }
 }
 return false;
 }
 public function getRangeForExpression($expression, $max)
 {
 $values = array();
 if ($this->isRange($expression) || $this->isIncrementsOfRanges($expression)) {
 if (!$this->isIncrementsOfRanges($expression)) {
 list ($offset, $to) = explode('-', $expression);
 $stepSize = 1;
 }
 else {
 $range = array_map('trim', explode('/', $expression, 2));
 $stepSize = isset($range[1]) ? $range[1] : 0;
 $range = $range[0];
 $range = explode('-', $range, 2);
 $offset = $range[0];
 $to = isset($range[1]) ? $range[1] : $max;
 }
 $offset = $offset == '*' ? 0 : $offset;
 for ($i = $offset; $i <= $to; $i += $stepSize) {
 $values[] = $i;
 }
 sort($values);
 }
 else {
 $values = array($expression);
 }
 return $values;
 }
}
