<?php

interface DatabaseInterface
{
    public const ORDER_ASC = true;
    public const ORDER_DESC = false;

    /**
     * Has to close the connection.
     */
    public function __destruct();

    /**
     * Sends an sql query to the database.
     */
    public function Query(string $query, array $params = []): void;

    /**
     * @return array
     */
    public function getResult(): array;

    /**
     * Selects backend from a table.
     */
    public function Select(
        string $tableName,
        array $fields = [],
        array $conditions = [],
        int $limit = 0,
        array $orderBy = [],
        bool $asc = true,
        int $offset = 0
    ): array;

    /**
     * Deletes rows from a table.
     */
    public function Delete(string $table, array $conditions): void;

    /**
     * Inserts a new row into the table.
     */
    public function Insert(string $table, array $fields): ?int;

    /**
     * Edits backend inside a table.
     */
    public function Update(string $table, array $fields, array $conditions): void;

    /**
     * Returns the number of entries found.
     */
    public function Count(string $table, array $conditions = []): int;

    /*
     * Returns if there's an open transaction.
     */
    public function hasTransaction(): bool;

    /*
     * Starts a transaction that can later be committed or rolled back.
     */
    public function startTransaction(): void;

    /*
     * Quits a current transaction without saving.
     */
    public function rollback(): void;

    /*
     * Saves and exits a current transaction.
     */
    public function commit(): void;

    /**
     * Returns the primary key from the last inserted row.
     */
    public function GetLastInsertedId(): int;
}