<?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\Manipulation;

use Phacil\Framework\MagiQL\Syntax\Where;
use Phacil\Framework\MagiQL\Api\QueryInterface;

/**
 * Class QueryFactory.
 */
final class QueryFactory
{
    /**
     * @param string $table
     * @param array  $columns
     *
     * @return Select
     */
    public static function createSelect($table = null, array $columns = null)
    {
        return new Select($table, $columns);
    }

    /**
     * @param string $table
     * @param array  $values
     *
     * @return Insert
     */
    public static function createInsert($table = null, array $values = null)
    {
        return new Insert($table, $values);
    }

    /**
     * @param string $table
     * @param array  $values
     *
     * @return Update
     */
    public static function createUpdate($table = null, array $values = null)
    {
        return new Update($table, $values);
    }

    /**
     * @param string $table
     *
     * @return Delete
     */
    public static function createDelete($table = null)
    {
        return new Delete($table);
    }

    /**
     * @param QueryInterface $query
     *
     * @return \Phacil\Framework\MagiQL\Api\WhereInterface
     */
    public static function createWhere(QueryInterface $query)
    {
        return new Where($query);
    }

    /**
     * @return Intersect
     */
    public static function createIntersect()
    {
        return new Intersect();
    }

    /**
     * @param Select $first
     * @param Select $second
     *
     * @return Minus
     */
    public static function createMinus(Select $first, Select $second)
    {
        return new Minus($first, $second);
    }

    /**
     * @return Union
     */
    public static function createUnion()
    {
        return new Union();
    }

    /**
     * @return UnionAll
     */
    public static function createUnionAll()
    {
        return new UnionAll();
    }
}