<?php

/**
 *
 * Cube Framework $Id$ Kd1ungvZB4yzI/+VveWY0SUHxDR1K0FyWjR+CEYITIs=
 *
 * @link        http://codecu.be/framework
 * @copyright   Copyright (c) 2017 CodeCube SRL
 * @license     http://codecu.be/framework/license Commercial License
 *
 * @version     1.10 [rev.1.10.01]
 */

/**
 * checks if the variable is greater than a set value (with option to check if greater or equal)
 */

namespace Cube\Validate;

class StringLength extends AbstractValidate
{

    const NO_STRING = 1;
    const TOO_SHORT = 2;
    const TOO_LONG = 3;

    protected $_messages = array(
        self::NO_STRING => "'%s' expects a string, invalid type given.",
        self::TOO_SHORT => "'%s' must contain at least %value% characters.",
        self::TOO_LONG  => "'%s' must contain no more than %value% characters.",
    );

    /**
     *
     * minimum characters allowed
     *
     * @var int
     */
    private $_min;

    /**
     *
     * maximum characters allowed
     *
     * @var int
     */
    private $_max;

    /**
     *
     * class constructor
     *
     * initialize the minimum and maximum values allowed
     *
     * @param array $data       data[0] -> min value;
     *                          data[1] -> max value;
     */
    public function __construct(array $data = null)
    {
        $this->setMin($data[0])
            ->setMax($data[1]);
    }

    /**
     *
     * get the minimum characters allowed
     *
     * @return int
     */
    public function getMin()
    {
        return $this->_min;
    }

    /**
     *
     * set minimum characters allowed
     *
     * @param int $min
     *
     * @return $this
     */
    public function setMin($min)
    {
        $this->_min = (integer)$min;

        return $this;
    }

    /**
     *
     * get max characters allowed
     *
     * @return int
     */
    public function getMax()
    {
        return $this->_max;
    }

    /**
     *
     * set max number of characters allowed
     *
     * @param int $max
     *
     * @return $this
     */
    public function setMax($max)
    {
        $this->_max = (integer)$max;

        return $this;
    }

    /**
     *
     * checks if the string length is within the allowed values
     * if the value is empty it will return true as the NotEmpty class should check that.
     *
     * @return bool          return true if the validation is successful
     */
    public function isValid()
    {
        $value = $this->getValue();

        if (empty($value)) {
            return true;
        }

        $min = $this->getMin();
        $max = $this->getMax();

        if (!is_string($value)) {
            $this->setMessage($this->_messages[self::NO_STRING]);

            return false;
        }
        else if (strlen($value) < $min) {
            $this->setMessage($this->_messages[self::TOO_SHORT]);
            $this->setMessage(
                str_replace('%value%', $min, $this->getMessage()));

            return false;
        }
        else if (strlen($value) > $max &&
            $max > $min
        ) {
            $this->setMessage($this->_messages[self::TOO_LONG]);
            $this->setMessage(
                str_replace('%value%', $max, $this->getMessage()));

            return false;
        }

        return true;
    }

}