import random

import app.database.controller as dbc
from app import create_app, db
from app.database.models import City, QuestionType, Role


def _add_items():
    media_types = ["Image", "Video"]
    question_types = ["Boolean", "Multiple", "Text"]
    component_types = ["Text", "Image"]
    view_types = ["Team", "Judge", "Audience", "Operator"]

    roles = ["Admin", "Editor"]
    cities = ["Linköping", "Stockholm", "Norrköping", "Örkelljunga"]
    teams = ["Gymnasieskola A", "Gymnasieskola B", "Gymnasieskola C"]

    for name in media_types:
        dbc.add.mediaType(name)

    for name in question_types:
        dbc.add.questionType(name)

    for name in component_types:
        dbc.add.componentType(name)

    for name in view_types:
        dbc.add.viewType(name)

    for name in roles:
        dbc.add.role(name)

    for name in cities:
        dbc.add.city(name)

    admin_id = Role.query.filter(Role.name == "Admin").one().id
    editor_id = Role.query.filter(Role.name == "Editor").one().id

    city_id = City.query.filter(City.name == "Linköping").one().id

    # Add users
    dbc.add.user("admin@test.se", "password", admin_id, city_id)
    dbc.add.user("test@test.se", "password", editor_id, city_id)

    question_types_items = dbc.get.all(QuestionType)

    # Add competitions
    for i in range(len(question_types_items)):
        item_comp = dbc.add.competition(f"Tävling {i}", 2000 + i, city_id)
        dbc.edit.slide(item_comp.slides[0], timer=5, title="test-slide-title")

        # Add two more slides to competition
        dbc.add.slide(item_comp)
        dbc.add.slide(item_comp)

        # Add slides
        for j, item_slide in enumerate(item_comp.slides):
            # Populate slide with data
            item_slide.title = f"Slide {j}"
            item_slide.body = f"Body {j}"
            item_slide.timer = 100 + j
            # item_slide.settings = "{}"
            dbc.utils.commit_and_refresh(item_slide)

            # Add question to competition
            dbc.add.question(
                name=f"Question {j}: {question_types_items[j].name}",
                total_score=j,
                type_id=question_types_items[j].id,
                item_slide=item_slide,
            )

            # Add text components
            # TODO: Add images as components
            for k in range(3):
                x = random.randrange(1, 500)
                y = random.randrange(1, 500)
                w = random.randrange(150, 400)
                h = random.randrange(150, 400)
                dbc.add.component(1, item_slide, {"text": f"hej{k}"}, x, y, w, h)

        # TODO: Remove comments when slide without questions is fixed
        # item_slide = dbc.add.slide(item_comp)
        # item_slide.title = f"Slide {len(item_comp.slides)}"
        # item_slide.body = f"Body {len(item_comp.slides)}"
        # item_slide.timer = 100 + j
        # # item_slide.settings = "{}"
        # dbc.utils.commit_and_refresh(item_slide)

        # Add teams
        for name in teams:
            dbc.add.team(f"{name}{i}", item_comp)


if __name__ == "__main__":
    app, _ = create_app("configmodule.DevelopmentConfig")

    with app.app_context():
        db.drop_all()
        db.create_all()
        _add_items()