# pylint: disable=unused-argument
# pylint: disable=redefined-outer-name
# pylint: disable=line-too-long

import pytest

from helpers.cluster import ClickHouseCluster

cluster = ClickHouseCluster(__file__)

n1 = cluster.add_instance("n1", main_configs=["configs/remote_servers.xml"])
n2 = cluster.add_instance("n2", main_configs=["configs/remote_servers.xml"])

params = pytest.mark.parametrize(
    "cluster,q",
    [
        ("internal_replication", 0),
        ("no_internal_replication", 1),
    ],
)


@pytest.fixture(scope="module", autouse=True)
def start_cluster():
    try:
        cluster.start()
        yield cluster
    finally:
        cluster.shutdown()


def create_tables(cluster):
    n1.query("DROP TABLE IF EXISTS data")
    n2.query("DROP TABLE IF EXISTS data")
    n1.query("DROP TABLE IF EXISTS dist")

    n1.query("CREATE TABLE data (key Int) Engine=Memory()")
    n2.query("CREATE TABLE data (key Int) Engine=Memory()")
    n1.query(
        """
    CREATE TABLE dist AS data
    Engine=Distributed(
        {cluster},
        currentDatabase(),
        data,
        rand()
    )
    """.format(
            cluster=cluster
        )
    )


def insert_data(cluster, **settings):
    create_tables(cluster)
    n1.query("INSERT INTO dist SELECT * FROM numbers(10)", settings=settings)
    n1.query("SYSTEM FLUSH DISTRIBUTED dist")


@params
def test_prefer_localhost_replica_1(cluster, q):
    insert_data(cluster)
    assert int(n1.query("SELECT count() FROM data")) == 10
    assert int(n2.query("SELECT count() FROM data")) == 10 * q


@params
def test_prefer_localhost_replica_1_load_balancing_in_order(cluster, q):
    insert_data(cluster, load_balancing="in_order")
    assert int(n1.query("SELECT count() FROM data")) == 10
    assert int(n2.query("SELECT count() FROM data")) == 10 * q


@params
def test_prefer_localhost_replica_0_load_balancing_nearest_hostname(cluster, q):
    insert_data(cluster, load_balancing="nearest_hostname", prefer_localhost_replica=0)
    assert int(n1.query("SELECT count() FROM data")) == 10
    assert int(n2.query("SELECT count() FROM data")) == 10 * q


@params
def test_prefer_localhost_replica_0_load_balancing_in_order(cluster, q):
    insert_data(cluster, load_balancing="in_order", prefer_localhost_replica=0)
    assert int(n1.query("SELECT count() FROM data")) == 10 * q
    assert int(n2.query("SELECT count() FROM data")) == 10


@params
def test_prefer_localhost_replica_0_load_balancing_in_order_sync(cluster, q):
    insert_data(
        cluster,
        load_balancing="in_order",
        prefer_localhost_replica=0,
        insert_distributed_sync=1,
    )
    assert int(n1.query("SELECT count() FROM data")) == 10 * q
    assert int(n2.query("SELECT count() FROM data")) == 10
