"""
This file contains functionality to delete data to the database.
"""

import app.core.http_codes as codes
import app.database.controller as dbc
from app.core import db
from app.database.models import Whitelist
from flask_restx import abort


def default(item):
    """ Deletes item and commits. """
    try:
        db.session.delete(item)
        db.session.commit()
    except:
        db.session.rollback()
        abort(codes.INTERNAL_SERVER_ERROR, f"Item of type {type(item)} could not be deleted")


def whitelist_to_blacklist(filters):
    """
    Remove whitelist by condition(filters) and insert those into blacklist
    Example: When delete user all whitelisted tokens for that user should be blacklisted
    """
    whitelist = Whitelist.query.filter(filters).all()
    for item in whitelist:
        dbc.add.blacklist(item.jti)

    Whitelist.query.filter(filters).delete()
    dbc.utils.commit()


def component(item_component):
    """ Deletes component. """

    default(item_component)


def _slide(item_slide):
    """ Internal delete for slide. """

    for item_question in item_slide.questions:
        question(item_question)

    for item_component in item_slide.components:
        default(item_component)

    default(item_slide)


def slide(item_slide):
    """ Deletes slide and updates order of other slides if neccesary. """

    competition_id = item_slide.competition_id
    slide_order = item_slide.order

    _slide(item_slide)

    # Update slide order for all slides after the deleted slide
    slides_in_same_competition = dbc.get.slide_list(competition_id)
    for other_slide in slides_in_same_competition:
        if other_slide.order > slide_order:
            other_slide.order -= 1

    db.session.commit()


def team(item_team):
    """ Deletes team, its question answers and the code. """

    for item_question_answer in item_team.question_answers:
        question_answers(item_question_answer)
    for item_code in item_team.code:
        code(item_code)

    default(item_team)


def question(item_question):
    """ Deletes question and its alternatives and answers. """

    for item_question_answer in item_question.question_answers:
        question_answers(item_question_answer)
    for item_alternative in item_question.alternatives:
        alternatives(item_alternative)
    default(item_question)


def alternatives(item_alternatives):
    """ Deletes question alternative. """

    default(item_alternatives)


def question_answers(item_question_answers):
    """ Deletes question answer. """

    default(item_question_answers)


def competition(item_competition):
    """ Deletes competition, its slides, teams and codes. """

    for item_slide in item_competition.slides:
        _slide(item_slide)
    for item_team in item_competition.teams:
        team(item_team)
    for item_code in item_competition.codes:
        code(item_code)

    default(item_competition)


def code(item_code):
    """ Deletes competition code. """

    default(item_code)