"""Routes for edit/readings."""
import os, json, pandas, security, surveyparser, shutil, utils
from bottle import Bottle, route, view, redirect, post, request

readings = Bottle()

@readings.route("/surveys/<name>/readings")
@view("readings")
@security.require_admin
def edit_readings(name):
    """Presents user with form to edit survey's readings or enter them for
    the first time if uploading. Readings are self-contained fieldsets that
    can be edited, added or removed."""
    survey, _ = surveyparser.get_survey(name)
    survey_readings = surveyparser.get_readings(name)

    fieldsets = [ reading["type"] for reading in survey_readings ]

    return dict(
        survey_name = name,
        survey = survey,
        metadata = surveyparser.get_metadata(name),
        readings = survey_readings,
        fieldsets = fieldsets,
        removed = [],
        uploading = request.query.get("uploading"),
    )

@readings.post("/surveys/<name>/readings")
@view("readings")
@security.require_admin
def edit_readings(name):
    """Apply and write changes to readings.json or add/remove reading."""
    survey, _ = surveyparser.get_survey(name)

    fieldsets = utils.safejsonloads(request.forms.get("fieldsets"))
    removed = utils.safejsonloads(request.forms.get("removed"))

    # Get new readings from form
    new_readings = []
    for i, fieldset in enumerate(fieldsets):
        if i not in removed:
            if fieldset == "loyalty":
                new_readings.append({
                    "type": fieldset,
                    "name": request.forms.get("reading-{}-name".format(i)),
                    "description": request.forms.get("reading-{}-description".format(i)),
                    "scorename": request.forms.get("reading-{}-scorename".format(i)),
                    "scores": request.forms.get("reading-{}-scores".format(i)),
                    "good": request.forms.getall("reading-{}-good".format(i)),
                    "bad": request.forms.getall("reading-{}-bad".format(i)),
                })
            elif fieldset == "agreement" or fieldset == "efficiency" or fieldset == "communication":
                new_readings.append({
                    "type": fieldset,
                    "name": request.forms.get("reading-{}-name".format(i)),
                    "description": request.forms.get("reading-{}-description".format(i)),
                    "agreement-questions": request.forms.getall("reading-{}-agreement-questions".format(i)),
                    "neither": request.forms.get("reading-{}-neither".format(i)),
                    "limit": int(request.forms.get("reading-{}-limit".format(i))), # HACK Check if int first
                    "agree-regex": request.forms.get("reading-{}-agree-regex".format(i)),
                    "disagree-regex": request.forms.get("reading-{}-disagree-regex".format(i)),
                    "satisfaction-question": request.forms.get("reading-{}-satisfaction-question".format(i)),
                    "satisfied-regex": request.forms.get("reading-{}-satisfied-regex".format(i)),
                    "disatisfied-regex": request.forms.get("reading-{}-disatisfied-regex".format(i)),
                    "generics": int(request.forms.get("reading-{}-generics".format(i))), # HACK Check if int first
                })

                for generic in range(new_readings[-1]["generics"]):
                    new_readings[-1]["generic-question-{}".format(generic)] = request.forms.get("reading-{}-generic-question-{}".format(i, generic))
                    new_readings[-1]["generic-plot-{}".format(generic)] = request.forms.get("reading-{}-generic-plot-{}".format(i, generic))

            elif fieldset == "satisfaction":
                new_readings.append({
                    "type": fieldset,
                    "name": request.forms.get("reading-{}-name".format(i)),
                    "description": request.forms.get("reading-{}-description".format(i)),
                    "question": request.forms.get("reading-{}-question".format(i)),
                    "neither": request.forms.get("reading-{}-neither".format(i)),
                    "plot": request.forms.get("reading-{}-plot".format(i)), # TODO Don't use user-friendly names here
                    "satisfied-regex": request.forms.get("reading-{}-satisfied-regex".format(i)),
                    "disatisfied-regex": request.forms.get("reading-{}-disatisfied-regex".format(i)),
                })
            elif fieldset == "wordcloud":
                new_readings.append({
                    "type": fieldset,
                    "name": request.forms.get("reading-{}-name".format(i)),
                    "description": request.forms.get("reading-{}-description".format(i)),
                    "question": request.forms.get("reading-{}-question".format(i)),
                    "words": request.forms.get("reading-{}-words".format(i)),
                })
            elif fieldset == "generic":
                new_readings.append({
                    "type": fieldset,
                    "name": request.forms.get("reading-{}-name".format(i)),
                    "description": request.forms.get("reading-{}-description".format(i)),
                    "question": request.forms.get("reading-{}-question".format(i)),
                    "plot": request.forms.get("reading-{}-plot".format(i)), # TODO Don't use user-friendly names here
                })

    # Dump to json if apply button was clicked
    action = request.forms.get("action")
    if action == "apply":
        path = os.path.join("db", "surveys", name, "readings.json")
        utils.safejsondump(new_readings, path)

        if request.query.uploading:
            redirect("/surveys/" + name)
        else:
            redirect("/surveys")

    # Add readings of requested kind
    elif action == "add-reading":
        fieldsets.append(request.forms.get("new-reading"))

    # Mark reading for removal
    elif action.split("-")[0] == "remove":
        removed.append(int(action.split("-")[1]))

    # TODO Implement templates
    elif action == "template":
        pass

    return dict(
        survey_name = name,
        survey = survey,
        metadata = surveyparser.get_metadata(name),
        readings = new_readings,
        fieldsets = fieldsets,
        removed = removed,
        uploading = request.query.get("uploading"),
    )
