import random
import string
import time
import uuid
from typing import Type

from tortoise import Tortoise, run_async, Model

from service.config import TORTOISE_ORM
from service.database.models import User

CHARS = string.ascii_letters + string.digits
user_count = 205
journal_count = 27
form_count = 2
form_input_count = 5
option_count = 8


def rand_str(k: int = 10) -> str:
    return "".join(random.choices(CHARS, k=k))


async def get_model_next_id(model: Type[Model]) -> int:
    max_uid = await model.all().order_by("-id").first()
    if max_uid is None:
        max_uid = 0
    else:
        max_uid = max_uid.id
    return max_uid + 1


async def do_import():
    await Tortoise.init(TORTOISE_ORM)
    _p = "$2b$12$3k.eYVcZxKRbSpRaz/R5luVxI0QI.CRiANGE8LINDGU6El9jYQxgC"
    usernames = [uuid.uuid4().hex for _ in range(user_count)]
    u_id = await get_model_next_id(User)
    users = [
        User(
            id=u_id + i,
            username=un,
            email=f"{un}@{{ cookiecutter.project_slug }}.com",
            password=_p,
        )
        for i, un in enumerate(usernames)
    ]
    ts = time.time()
    await User.bulk_create(users)
    print(f"User: {len(users)} rows in {time.time() - ts:.5f}s)")

    uc = len(users)
    print(
        "Data generation finished!\n"
        f"Total of {sum((uc, ))} objects created!\n"
        f"Generated {uc} Users"
    )
    toc = await User.all().count()
    print(
        "Total elements in tables:\n"
        f"Users: {toc}\n"
        f"Total: {toc}"
    )


def main():
    start_ts = time.time()
    run_async(do_import())
    end_ts = time.time()
    print(f"Data generated in {end_ts - start_ts:.3f}s")


if __name__ == "__main__":
    main()
