"""empty message

Revision ID: a43b9748ceee
Revises: 0eeaa5aed53b
Create Date: 2019-06-12 12:50:15.809839

"""
from alembic import op
from backend.models.postgis.statuses import TaskStatus


# revision identifiers, used by Alembic.
revision = "a43b9748ceee"
down_revision = "0eeaa5aed53b"
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index(
        "idx_task_validation_mapper_status_composite",
        table_name="task_invalidation_history",
    )
    op.create_index(
        "idx_task_validation_mapper_status_composite",
        "task_invalidation_history",
        ["invalidator_id", "is_closed"],
        unique=False,
    )
    # ### end Alembic commands ###

    # Recalculate tasks stats based on the task states in projects
    conn = op.get_bind()
    projects = conn.execute("select id from projects")
    print("Recalculating projects' tasks stats... can take a bit")
    for project_id in projects:
        _set_project_counters_from_task_states(project_id[0])


def _set_project_counters_from_task_states(project_id: int):

    # Obtain and process information of the project's tasks' statuses
    conn = op.get_bind()

    tasks_statuses = conn.execute(
        "SELECT task_status, count(task_status) FROM tasks WHERE project_id={0} GROUP BY task_status"
        "".format(project_id)
    )
    tasks_statuses = [r for r in tasks_statuses]

    # Set values to the stats in the database
    tasks_mapped = sum([n for s, n in tasks_statuses if s == TaskStatus.MAPPED.value])
    tasks_validated = sum(
        [n for s, n in tasks_statuses if s == TaskStatus.VALIDATED.value]
    )
    tasks_bad_imagery = sum(
        [n for s, n in tasks_statuses if s == TaskStatus.BADIMAGERY.value]
    )
    query = (
        "UPDATE projects "
        + "SET tasks_mapped ="
        + str(tasks_mapped)
        + ", tasks_validated="
        + str(tasks_validated)
        + ", tasks_bad_imagery="
        + str(tasks_bad_imagery)
        + " where id = "
        + str(project_id)
    )
    op.execute(query)


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index(
        "idx_task_validation_mapper_status_composite",
        table_name="task_invalidation_history",
    )
    op.create_index(
        "idx_task_validation_mapper_status_composite",
        "task_invalidation_history",
        ["mapper_id", "is_closed"],
        unique=False,
    )
    # ### end Alembic commands ###
