<?php

declare(strict_types=1);

namespace Doctrine\DBAL\Schema\Synchronizer;

use Doctrine\DBAL\Schema\Schema;

/**
 * The synchronizer knows how to synchronize a schema with the configured
 * database.
 */
interface SchemaSynchronizer
{
    /**
     * Gets the SQL statements that can be executed to create the schema.
     *
     * @return array<int, string>
     */
    public function getCreateSchema(Schema $createSchema) : array;

    /**
     * Gets the SQL Statements to update given schema with the underlying db.
     *
     * @return array<int, string>
     */
    public function getUpdateSchema(Schema $toSchema, bool $noDrops = false) : array;

    /**
     * Gets the SQL Statements to drop the given schema from underlying db.
     *
     * @return string[]
     */
    public function getDropSchema(Schema $dropSchema) : array;

    /**
     * Gets the SQL statements to drop all schema assets from underlying db.
     *
     * @return array<int, string>
     */
    public function getDropAllSchema() : array;

    /**
     * Creates the Schema.
     */
    public function createSchema(Schema $createSchema) : void;

    /**
     * Updates the Schema to new schema version.
     */
    public function updateSchema(Schema $toSchema, bool $noDrops = false) : void;

    /**
     * Drops the given database schema from the underlying db.
     */
    public function dropSchema(Schema $dropSchema) : void;

    /**
     * Drops all assets from the underlying db.
     */
    public function dropAllSchema() : void;
}