"""Routes for survey."""
import pandas
import surveyparser
import security
import os
from bottle import Bottle, route, view, post, request, abort

survey = Bottle()


@survey.route("/surveys/<name>")
@view("survey")
def get_survey(name):
    """Present survey metrics and allow for filtering."""
    # Make sure user has perms. to see the survey, otherwise respond 403
    session = request.environ.get("beaker.session")
    if not security.has_survey(session.get("username"), name):
        abort(403)

    base = os.path.join("db", "surveys")
    # Make sure surveys/ or create it otherwise
    os.makedirs(base, exist_ok=True)
    surveys = next(os.walk(base))[1]  # List dirs only

    survey, properties = surveyparser.get_survey(name)
    foreced_filter = security.user_filters(session.get("username"), name)
    survey = surveyparser.filter_survey(
        survey, properties, surveyparser.get_metadata(name), foreced_filter)

    compare_name = properties["compare-with"]
    compared = pandas.DataFrame()
    if compare_name in surveys:
        compared, compared_properties = surveyparser.get_survey(compare_name)
        compared = surveyparser.filter_survey(
            compared, compared_properties, surveyparser.get_metadata(compare_name), foreced_filter)

    return dict(
        no_filters=0,
        survey_name=name,
        selected_answers=foreced_filter,
        survey=survey,
        filtered=survey,
        compared=compared,
        metadata=surveyparser.get_metadata(name),
        properties=properties,
        readings=surveyparser.get_readings(name),
    )


# TODO Optimize
@survey.post("/surveys/<name>")
@view("survey")
def get_survey(name):
    """Apply filters to the survey."""
    # Make sure user has perms. to see the survey, otherwise respond 403
    session = request.environ.get("beaker.session")
    if not security.has_survey(session.get("username"), name):
        abort(403)

    base = os.path.join("db", "surveys")
    # Make sure surveys/ or create it otherwise
    os.makedirs(base, exist_ok=True)
    surveys = next(os.walk(base))[1]  # List dirs only

    foreced_filter = security.user_filters(session.get("username"), name)

    survey, properties = surveyparser.get_survey(name)
    survey = surveyparser.filter_survey(
        survey, properties, surveyparser.get_metadata(name), foreced_filter)

    compare_name = properties["compare-with"]
    compared = pandas.DataFrame()
    compared_properties = {}
    if compare_name in surveys:
        compared, compared_properties = surveyparser.get_survey(compare_name)
        compared = surveyparser.filter_survey(
            compared, compared_properties, surveyparser.get_metadata(compare_name), foreced_filter)

    # Add aditional filtering fields
    no_filters = request.forms.get("no-filters")
    no_filters = int(no_filters) if no_filters else 0
    no_filters = min(max(0, no_filters), 24)

    # Compile all of the desired answers for each question in a dictionary
    # TODO For some reason same answers are appended multiple times... fix
    selected_answers = {}
    for i in range(no_filters):
        question = request.forms.get("question-" + str(i))
        answers = request.forms.getall("answers-" + str(i))

        if answers:
            if question not in selected_answers:
                selected_answers[question] = []

            selected_answers[question] = selected_answers[question] + answers

    # Filter by selected answers
    filtered = survey
    action = request.forms.get("action")
    if action == "filter":
        filtered = surveyparser.filter_survey(
            survey, properties, surveyparser.get_metadata(name), selected_answers)
        
        if compare_name in surveys:
            compared = surveyparser.filter_survey(
                compared, compared_properties, surveyparser.get_metadata(compare_name), selected_answers)

    return dict(
        no_filters=no_filters,
        survey_name=name,
        selected_answers=selected_answers,
        survey=survey,
        filtered=filtered,
        compared=compared,
        metadata=surveyparser.get_metadata(name),
        properties=properties,
        readings=surveyparser.get_readings(name),
    )
