<?php

/**
 * Copyright © 2023 ExacTI Technology Solutions. All rights reserved.
 * GPLv3 General License.
 * https://exacti.com.br
 * Phacil PHP Framework - https://github.com/exacti/phacil-framework
 */

namespace Phacil\Framework\MagiQL\Syntax;

use Phacil\Framework\MagiQL\Api\Syntax\OrderBy as OrderByInterface;

/**
 * Class OrderBy.
 */
class OrderBy implements OrderByInterface
{

    /**
     * @var Column
     */
    protected $column;

    /**
     * @var string
     */
    protected $direction;

    /**
     * @var bool
     */
    protected $useAlias;

    /**
     * @param Column $column
     * @param string $direction
     */
    public function __construct(Column $column, $direction)
    {
        $this->setColumn($column);
        $this->setDirection($direction);
    }

    /**
     * @return Column
     */
    public function getColumn()
    {
        return $this->column;
    }

    /**
     * @param Column $column
     *
     * @return $this
     */
    public function setColumn($column)
    {
        $this->column = $column;

        return $this;
    }

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

    /**
     * @param string $direction
     *
     * @throws \Phacil\Framework\Exception\InvalidArgumentException
     *
     * @return $this
     */
    public function setDirection($direction)
    {
        if (!in_array($direction, array(OrderByInterface::ASC, OrderByInterface::DESC))) {
            throw new \Phacil\Framework\Exception\InvalidArgumentException(
                "Specified direction '$direction' is not allowed. Only ASC or DESC are allowed."
            );
        }
        $this->direction = $direction;

        return $this;
    }
}