from .connection import Connection
from .errors import (
    Warning,
    Error,
    DataError,
    DatabaseError,
    ProgrammingError,
    IntegrityError,
    InterfaceError,
    InternalError,
    NotSupportedError,
    OperationalError,
)
from .. import defines

apilevel = "2.0"

threadsafety = 2

paramstyle = "pyformat"


def connect(
    dsn=None,
    host=None,
    user=defines.DEFAULT_USER,
    password=defines.DEFAULT_PASSWORD,
    port=defines.DEFAULT_PORT,
    database=defines.DEFAULT_DATABASE,
    **kwargs
):
    """
    Create a new database connection.

    The connection can be specified via DSN:

        ``conn = connect("clickhouse://localhost/test?param1=value1&...")``

    or using database and credentials arguments:

        ``conn = connect(database="test", user="default", password="default",
        host="localhost", **kwargs)``

    The basic connection parameters are:

    - *host*: host with running ClickHouse server.
    - *port*: port ClickHouse server is bound to.
    - *database*: database connect to.
    - *user*: database user.
    - *password*: user's password.

    See defaults in :data:`~clickhouse_driver.connection.Connection`
    constructor.

    DSN or host is required.

    Any other keyword parameter will be passed to the underlying Connection
    class.

    :return: a new connection.
    """

    if dsn is None and host is None:
        raise ValueError("host or dsn is required")

    return Connection(dsn=dsn, user=user, password=password, host=host, port=port, database=database, **kwargs)


__all__ = [
    "connect",
    "Warning",
    "Error",
    "DataError",
    "DatabaseError",
    "ProgrammingError",
    "IntegrityError",
    "InterfaceError",
    "InternalError",
    "NotSupportedError",
    "OperationalError",
]
