import random
import string

import pytest
from selenium import webdriver
from selenium.common.exceptions import WebDriverException


def random_string(n):
    return "".join(
        random.choice(string.ascii_uppercase + string.digits) for _ in range(n)
    )


def random_name(n):
    words = (
        "".join(random.choice(string.ascii_lowercase + " ") for _ in range(n))
        .strip()
        .split(" ")
    )
    return "-".join([x.capitalize() for x in words])


@pytest.fixture(scope="session")
def driver():
    chrome_options = webdriver.ChromeOptions()
    chrome_options.headless = True
    try:
        b = webdriver.Chrome(options=chrome_options)
    except WebDriverException as e:
        pytest.skip(str(e))
    else:
        yield b
        b.quit()


@pytest.fixture
def genres(db):
    from .testapp.models import Genre

    return Genre.objects.bulk_create(
        [Genre(pk=pk, title=random_string(50)) for pk in range(100)]
    )


@pytest.fixture
def artists(db):
    from .testapp.models import Artist

    return Artist.objects.bulk_create(
        [Artist(pk=pk, title=random_string(50)) for pk in range(100)]
    )


@pytest.fixture
def countries(db):
    from .testapp.models import Country

    return Country.objects.bulk_create(
        [Country(pk=pk, name=random_name(random.randint(10, 20))) for pk in range(10)]
    )


@pytest.fixture
def cities(db, countries):
    from .testapp.models import City

    return City.objects.bulk_create(
        [
            City(
                pk=pk,
                name=random_name(random.randint(5, 15)),
                country=random.choice(countries),
            )
            for pk in range(100)
        ]
    )
