<?php

namespace LdapRecord\Testing;

use LdapRecord\LdapRecordException;
use PHPUnit\Framework\Constraint\Constraint;
use PHPUnit\Framework\Constraint\IsEqual;
use UnexpectedValueException;

class LdapExpectation
{
    /**
     * The value to return from the expectation.
     *
     * @var mixed
     */
    protected $value;

    /**
     * The exception to throw from the expectation.
     *
     * @var null|LdapRecordException|\Exception
     */
    protected $exception;

    /**
     * The amount of times the expectation should be called.
     *
     * @var int
     */
    protected $count = 1;

    /**
     * The method that the expectation belongs to.
     *
     * @var string
     */
    protected $method;

    /**
     * The methods argument's.
     *
     * @var array
     */
    protected $args = [];

    /**
     * Whether the same expectation should be returned indefinitely.
     *
     * @var bool
     */
    protected $indefinitely = true;

    /**
     * Whether the expectation should return errors.
     *
     * @var bool
     */
    protected $errors = false;

    /**
     * The error number to return.
     *
     * @var int
     */
    protected $errorCode = 1;

    /**
     * The last error string to return.
     *
     * @var string
     */
    protected $errorMessage = '';

    /**
     * The diagnostic message string to return.
     *
     * @var string
     */
    protected $errorDiagnosticMessage = '';

    /**
     * Constructor.
     *
     * @param string $method
     */
    public function __construct($method)
    {
        $this->method = $method;
    }

    /**
     * Set the arguments that the operation should receive.
     *
     * @param mixed $args
     *
     * @return $this
     */
    public function with($args)
    {
        $args = is_array($args) ? $args : func_get_args();

        foreach ($args as $key => $arg) {
            if (! $arg instanceof Constraint) {
                $args[$key] = new IsEqual($arg);
            }
        }

        $this->args = $args;

        return $this;
    }

    /**
     * Set the expected value to return.
     *
     * @param mixed $value
     *
     * @return $this
     */
    public function andReturn($value)
    {
        $this->value = $value;

        return $this;
    }

    /**
     * The error message to return from the expectation.
     *
     * @param int    $code
     * @param string $error
     * @param string $diagnosticMessage
     *
     * @return $this
     */
    public function andReturnError($code = 1, $error = '', $diagnosticMessage = '')
    {
        $this->errors = true;

        $this->errorCode = $code;
        $this->errorMessage = $error;
        $this->errorDiagnosticMessage = $diagnosticMessage;

        return $this;
    }

    /**
     * Set the expected exception to throw.
     *
     * @param string|\Exception|LdapRecordException $exception
     *
     * @return $this
     */
    public function andThrow($exception)
    {
        if (is_string($exception)) {
            $exception = new LdapRecordException($exception);
        }

        $this->exception = $exception;

        return $this;
    }

    /**
     * Set the expectation to be only called once.
     *
     * @return $this
     */
    public function once()
    {
        return $this->times(1);
    }

    /**
     * Set the expectation to be only called twice.
     *
     * @return $this
     */
    public function twice()
    {
        return $this->times(2);
    }

    /**
     * Set the expectation to be called the given number of times.
     *
     * @param int $count
     *
     * @return $this
     */
    public function times($count = 1)
    {
        $this->indefinitely = false;

        $this->count = $count;

        return $this;
    }

    /**
     * Get the method the expectation belongs to.
     *
     * @return string
     */
    public function getMethod()
    {
        if (is_null($this->method)) {
            throw new UnexpectedValueException('An expectation must have a method.');
        }

        return $this->method;
    }

    /**
     * Get the expected call count.
     *
     * @return int
     */
    public function getExpectedCount()
    {
        return $this->count;
    }

    /**
     * Get the expected arguments.
     *
     * @return Constraint[]
     */
    public function getExpectedArgs()
    {
        return $this->args;
    }

    /**
     * Get the expected exception.
     *
     * @return null|\Exception|LdapRecordException
     */
    public function getExpectedException()
    {
        return $this->exception;
    }

    /**
     * Get the expected value.
     *
     * @return mixed
     */
    public function getExpectedValue()
    {
        return $this->value;
    }

    /**
     * Determine whether the expectation is returning an error.
     *
     * @return bool
     */
    public function isReturningError()
    {
        return $this->errors;
    }

    /**
     * @return int
     */
    public function getExpectedErrorCode()
    {
        return $this->errorCode;
    }

    /**
     * @return string
     */
    public function getExpectedErrorMessage()
    {
        return $this->errorMessage;
    }

    /**
     * @return string
     */
    public function getExpectedErrorDiagnosticMessage()
    {
        return $this->errorDiagnosticMessage;
    }

    /**
     * Decrement the call count of the expectation.
     *
     * @return $this
     */
    public function decrementCallCount()
    {
        if (! $this->indefinitely) {
            $this->count -= 1;
        }

        return $this;
    }
}
