<?php
if (!file_exists(__DIR__.'/vendor/autoload.php')) {
    echo 'Please build a vendor with the following composer.json', PHP_EOL,PHP_EOL,
    '{
    "name": "rquadling/test",
    "description": "Test for RQuadling",
    "license": "proprietary",
    "require": {
        "beberlei/assert": "^2.5",
        "gws/php-valueobjects": "^0.3"
    },
    "require-dev": {
        "phpunit/phpunit": "^4.0.0"
    }
}
';
    die('Thank you');
} else {
    require_once __DIR__.'/vendor/autoload.php';
}

use Assert\Assertion;
use Assert\LazyAssertionException;
use Vo\DateTimeRange;

class cutDownCriteriaClass
{
    /**#@+
     * Date and DateTime Formats
     */
    const DATETIME_FORMAT = 'Y-m-d H:i:s';
    const DATE_FORMAT     = 'Y-m-d';
    /**#@-*/

    /**#@+
     * Time values for start and end of date ranges.
     */
    const RANGE_TIME_END   = '23:59:59';
    const RANGE_TIME_START = '00:00:00';
    /**#@-*/

    /**
     * The range for sales dates.
     *
     * @var DateTimeRange
     */
    protected $salesDateRange;


    /**
     * Set a single sales date
     *
     * Helper method to build a sales date range from a single date.
     *
     * @param string $salesDate All time elements are ignored.
     */
    public function setSalesDate($salesDate)
    {
        $salesDate = $this->sanitizeDate($salesDate, 'salesDate');
        $salesDateFrom = clone $salesDate;
        $salesDateTo = clone $salesDate;

        $this->setSalesDateRange($salesDateFrom->setTime(0, 0, 0)->format(self::DATETIME_FORMAT), $salesDateTo->setTime(23, 59, 59)->format(self::DATETIME_FORMAT));
    }

    /**
     * Set sales date range
     *
     * @param string $salesDateStart
     * @param string $salesDateEnd
     */
    public function setSalesDateRange($salesDateStart = null, $salesDateEnd = null)
    {
        $salesDateStart = $this->sanitizeDate($salesDateStart ? $salesDateStart : DateTimeRange::PAST, 'salesDateRangeStart');
        $salesDateEnd = $this->sanitizeDate($salesDateEnd ? $salesDateEnd : DateTimeRange::FUTURE, 'salesDateRangeEnd');

        \Assert\lazy()->that($salesDateStart, 'salesDateTimeRangeStart')->lessOrEqualThan($salesDateEnd)->verifyNow();

        $this->salesDateRange = new DateTimeRange($salesDateStart->setTime(0, 0, 0), $salesDateEnd->setTime(23, 59, 59));
    }

    /**
     * Validate and sanitize a single date.
     *
     * The time part can be supplied, but will be ignored.
     *
     * @param string $date         The date to be sanitized
     * @param string $propertyPath The name of the property for assertion reporting.
     *
     * @return \DateTime With the time set to midnight with a Europe/London timezone.
     */
    private function sanitizeDate($date, $propertyPath)
    {
        Assertion::string($date, sprintf("Only date strings in the form of '%s' or '%s' are accepted.", self::DATE_FORMAT, self::DATETIME_FORMAT), $propertyPath);

        try {
            \Assert\lazy()->that($date, $propertyPath)->date(self::DATE_FORMAT)->verifyNow();
        } catch (LazyAssertionException $ex) {
            \Assert\lazy()->that($date, $propertyPath)->date(self::DATETIME_FORMAT)->verifyNow();
        }

        return (new \DateTime($date, new \DateTimeZone('Europe/London')))->setTime(0, 0, 0);
    }
}

class cutDownCriteriaClassTester extends PHPUnit_Framework_TestCase
{
    public function testReset()
    {
        $test = new cutDownCriteriaClass;
        $test->setSalesDate('2007-08-09');
    }
}
