<?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\Builder\Syntax;

use Phacil\Framework\MagiQL\Api\BuilderInterface;
use Phacil\Framework\Databases\Api\DriverInterface as DatabaseDriverInterface;

/**
 * Class WriterFactory.
 */
final class WriterFactory
{
    /**
     * @param \Phacil\Framework\MagiQL\Api\BuilderInterface    $writer
     * @param PlaceholderWriter $placeholderWriter
     *
     * @return ColumnWriter
     */
    public static function createColumnWriter(\Phacil\Framework\MagiQL\Api\BuilderInterface $writer, PlaceholderWriter $placeholderWriter)
    {
        return new ColumnWriter($writer, $placeholderWriter);
    }

    /**
     * @param BuilderInterface    $writer
     * @param PlaceholderWriter $placeholderWriter
     *
     * @return WhereWriter
     */
    public static function createWhereWriter(BuilderInterface $writer, PlaceholderWriter $placeholderWriter)
    {
        return new WhereWriter($writer, $placeholderWriter);
    }

    /**
     * @param \Phacil\Framework\MagiQL\Api\BuilderInterface    $writer
     * @param PlaceholderWriter $placeholderWriter
     *
     * @return SelectWriter
     */
    public static function createSelectWriter(BuilderInterface $writer, PlaceholderWriter $placeholderWriter)
    {
        /** @var \Phacil\Framework\MagiQL $writer */
        
        switch ($writer->getDb()->getDBTypeId()) {
            case DatabaseDriverInterface::LIST_DB_TYPE_ID['MYSQL']:
            case DatabaseDriverInterface::LIST_DB_TYPE_ID['SQLLITE3']:
                return new SelectWriter($writer, $placeholderWriter);
                break;

            case DatabaseDriverInterface::LIST_DB_TYPE_ID['MSSQL']:
                return new \Phacil\Framework\MagiQL\Builder\Syntax\Adapt\MSSQL\SelectWriter($writer, $placeholderWriter);
                break;

            case DatabaseDriverInterface::LIST_DB_TYPE_ID['POSTGRE']:
                return new \Phacil\Framework\MagiQL\Builder\Syntax\Adapt\PostgreSQL\SelectWriter($writer, $placeholderWriter);
                break;

            case DatabaseDriverInterface::LIST_DB_TYPE_ID['ORACLE']:
                return new \Phacil\Framework\MagiQL\Builder\Syntax\Adapt\Oracle\SelectWriter($writer, $placeholderWriter);
                break;
            
            default:
                return new SelectWriter($writer, $placeholderWriter);
                break;
        }
        return new SelectWriter($writer, $placeholderWriter);
    }

    /**
     * @param \Phacil\Framework\MagiQL\Api\BuilderInterface $writer
     * @param PlaceholderWriter $placeholderWriter
     *
     * @return InsertWriter
     */
    public static function createInsertWriter(\Phacil\Framework\MagiQL\Api\BuilderInterface $writer, PlaceholderWriter $placeholderWriter)
    {
        /** @var \Phacil\Framework\MagiQL $writer */
        switch ($writer->getDb()->getDBTypeId()) {
            case DatabaseDriverInterface::LIST_DB_TYPE_ID['MYSQL']:
            case DatabaseDriverInterface::LIST_DB_TYPE_ID['MSSQL']:
            case DatabaseDriverInterface::LIST_DB_TYPE_ID['ORACLE']:
                return new InsertWriter($writer, $placeholderWriter);
                break;

            case DatabaseDriverInterface::LIST_DB_TYPE_ID['POSTGRE']:
            case DatabaseDriverInterface::LIST_DB_TYPE_ID['SQLLITE3']:
                return new \Phacil\Framework\MagiQL\Builder\Syntax\Adapt\SQLite3\InsertWriter($writer, $placeholderWriter);
                break;

            default:
                return new InsertWriter($writer, $placeholderWriter);
                break;
        }
        return new InsertWriter($writer, $placeholderWriter);
    }

    /**
     * @param BuilderInterface $writer
     * @param PlaceholderWriter $placeholderWriter
     *
     * @return UpdateWriter
     */
    public static function createUpdateWriter(BuilderInterface $writer, PlaceholderWriter $placeholderWriter)
    {
        /** @var \Phacil\Framework\MagiQL $writer */
        switch ($writer->getDb()->getDBTypeId()) {
            case DatabaseDriverInterface::LIST_DB_TYPE_ID['MYSQL']:
            case DatabaseDriverInterface::LIST_DB_TYPE_ID['MSSQL']:
            case DatabaseDriverInterface::LIST_DB_TYPE_ID['ORACLE']:
                return new UpdateWriter($writer, $placeholderWriter);
                break;

            case DatabaseDriverInterface::LIST_DB_TYPE_ID['POSTGRE']:
                return new \Phacil\Framework\MagiQL\Builder\Syntax\Adapt\PostgreSQL\UpdateWriter($writer, $placeholderWriter);
                break;

            case DatabaseDriverInterface::LIST_DB_TYPE_ID['SQLLITE3']:
                return new \Phacil\Framework\MagiQL\Builder\Syntax\Adapt\SQLite3\UpdateWriter($writer, $placeholderWriter);
                break;

            default:
                return new UpdateWriter($writer, $placeholderWriter);
                break;
        }
        return new UpdateWriter($writer, $placeholderWriter);
    }

    /**
     * @param \Phacil\Framework\MagiQL\Api\BuilderInterface $writer
     * @param PlaceholderWriter $placeholderWriter
     *
     * @return DeleteWriter
     */
    public static function createDeleteWriter(BuilderInterface $writer, PlaceholderWriter $placeholderWriter)
    {
        return new DeleteWriter($writer, $placeholderWriter);
    }

    /**
     * @return PlaceholderWriter
     */
    public static function createPlaceholderWriter()
    {
        return new PlaceholderWriter();
    }

    /**
     * @param \Phacil\Framework\MagiQL\Api\BuilderInterface $writer
     *
     * @return IntersectWriter
     */
    public static function createIntersectWriter(\Phacil\Framework\MagiQL\Api\BuilderInterface $writer)
    {
        return new IntersectWriter($writer);
    }

    /**
     * @param \Phacil\Framework\MagiQL\Api\BuilderInterface $writer
     *
     * @return MinusWriter
     */
    public static function createMinusWriter(\Phacil\Framework\MagiQL\Api\BuilderInterface $writer)
    {
        return new MinusWriter($writer);
    }

    /**
     * @param BuilderInterface $writer
     *
     * @return UnionWriter
     */
    public static function createUnionWriter(BuilderInterface $writer)
    {
        return new UnionWriter($writer);
    }

    /**
     * @param \Phacil\Framework\MagiQL\Api\BuilderInterface $writer
     *
     * @return UnionAllWriter
     */
    public static function createUnionAllWriter(BuilderInterface $writer)
    {
        return new UnionAllWriter($writer);
    }
}