from flask_wtf import Form
from werkzeug import secure_filename
from flask_wtf.file import FileField, FileRequired, FileAllowed
from wtforms import FloatField, IntegerField, TextField, StringField, TextAreaField
from wtforms.validators import Required, Optional
from core.database.models import Question, Essay
from flask.ext.login import current_user
import csv

class QuestionForm(Form):
    name = StringField('Name', [Required()], description="The name you want to give this question.", )
    prompt = TextAreaField('Prompt', [Optional()], description="The prompt for this question (optional).")

    def save(self):
        from app import db
        q = Question(user=current_user)
        self.populate_obj(q)
        db.session.add(q)
        db.session.commit()

class EssayForm(Form):
    text = TextAreaField('Text', [Required()], description="The text of the essay.")
    actual_score = FloatField('Score (optional)', [Optional()],  description="The score the essay got, if it has a score.")
    info = TextAreaField("Additional Info (optional)", [Optional()], description="Any additional info you want to store with this essay.")

    def save(self, question):
        from app import db
        e = Essay(question=question)
        self.populate_obj(e)
        db.session.add(e)
        db.session.commit()


class EssayDialect(csv.Dialect):
    quoting = csv.QUOTE_MINIMAL
    delimiter = ","
    quotechar = "\""
    lineterminator = "\n"

class EssayUploadForm(Form):
    upload = FileField('File', [FileRequired(), FileAllowed(['csv'], 'CSV files only!')], description="The csv file with essays you want to upload.")

    def save(self, question, csvfile):
        from app import db
        csvfile.seek(0)
        reader = csv.reader(csvfile, EssayDialect)
        for i, row in enumerate(reader):
            if i == 0:
                continue

            score = row[-1]
            text = ",".join(row[:-1])

            if len(score) == 0:
                score = None
            else:
                score = float(score)
            e = Essay(question=question, text=text, actual_score=score)
            db.session.add(e)
        db.session.commit()