# -*- coding: utf-8 -*-

"""Routes for upload."""
import os, json, security, surveyparser, utils
from bottle import Bottle, route, view, post, request, redirect, abort

upload = Bottle()

default_properties = {
    "public": False,
    "anon-matches": 0,
    "guests": 0,
    "notes": "",
    "hidden-columns": [],
}
default_readings = []

@upload.route("/upload")
@view("upload")
@security.require_admin
def upload_survey():
    """Presents user with form to upload a new survey from a raw .csv file."""
    return dict()

@upload.post("/upload")
@view("upload")
@security.require_admin
def upload_survey():
    """Validate upload request, create directory, upload raw, parse into
    survey and generate placeholder .jsons. Redirect to step 2 (edit/properties)"""
    name = request.forms.get("name")
    base = os.path.join("db","surveys", name)

    name = name.replace("%", "_") # We can't have "%" because it's used as a delimiter elsewhere in the code
    name = name.replace("/", "_") # And "/" for obvious reasons

    # HACK Checking for "/" is not real filename validation
    if not os.path.isdir(base):
        # Save files to surveys/name/
        os.makedirs(base)

        # Write raw
        request.files.get("raw").save(os.path.join(base, "raw.csv"), overwrite=True)

        # Pre-parse and write survey
        survey, metadata = surveyparser.parse_file(os.path.join(base, "raw.csv"), [])
        surveyparser.write(survey, base, metadata)

        # Write placeholders
        utils.safejsondump(default_properties, os.path.join(base, "properties.json"))
        utils.safejsondump(default_readings, os.path.join(base, "readings.json"))

        # Go to edit and raise get flag that we came from uploading raw
        redirect("/surveys/" + name + "/properties?uploading=1")

    # Respond 400 upon validation failure
    # TODO More useful error, especially when name already taken
    else:
        abort(400)
