from flask import Flask, render_template, redirect, url_for
from flask_bootstrap import Bootstrap5
from flask_wtf import FlaskForm, CSRFProtect
from wtforms import (StringField, SubmitField, TextAreaField, IntegerField, RadioField)
from vals import *
import platform, re, readline
currOS = platform.platform()
if currOS.find('Windows') == 0:
    LOCALBASE = 'D:/website/'
else:
    LOCALBASE = '/mnt/d/website/'
import secrets
# Bootstrap-Flask requires this line
app = Flask(__name__)
foo = secrets.token_urlsafe(16)
app.secret_key = foo
csrf = CSRFProtect(app)
bootstrap = Bootstrap5(app)

# GLOBALS
CONTRIBDIR = LOCALBASE + 'contributors/'
TEMPLATE = CONTRIBDIR + 'template.ft3'
# these will come from account data
my_enc_first = 'Sarge'
my_enc_last = 'Gerbode'
my_ed_first = 'Sarge'
my_ed_last = 'Gerbode'
myeditor = my_ed_first + ' ' + my_ed_last
myencoder = my_enc_first + ' ' + my_enc_last
my_dir = my_enc_last + my_enc_first[0]

def add_default_to_form(diDefault):
    class OutputForm(FlaskForm):
        outputfile = StringField('Output file (Required). Will overwrite an existing file:', \
        default = diDefault['outputfile'], \
        validators = [Length(1, 60), output_val])
        myname = StringField('Full name (first and last):', \
        default = diDefault['encoder'], \
        validators = [Length(1, 40), name_val])
        title = StringField('Title:', default = diDefault['title'], \
        validators = [InputRequired(), Length(3, 40)])
        subtitle = StringField('Subtitle:',\
        default = diDefault['subtitle'], \
        validators = [Optional(), Length(3, 40)])
        composer = StringField('Composer:',\
        default = diDefault['composer'], \
        validators = [InputRequired(), Length(2,40)])
        composer0 = StringField('Original composer (optional):', \
        default = diDefault['composer0'], \
        validators = [Optional(), Length(2,40)])
        ensemble = StringField('Ensemble (comma-separated list of instruments or voices):', \
        default = diDefault['ensemble'], \
        validators = [InputRequired(), ensemble_val])
        part = StringField('Part ("score", or comma-separated list of instruments or voices):', \
        default = diDefault['part'], \
        validators = [Optional(), ensemble_val])
        key = StringField('Comma-separated list of keys, like Abm, EM:', \
        default = diDefault['key'], \
        validators = [InputRequired(), key_val])
        difficulty = RadioField('Difficulty (choose one):', \
        choices=[('0', 'Beginner'), ('1', 'Easy'), ('2', 'Medium'), ('3', 'Challenging'), ('4', 'Hard'), ('5', 'Virtuoso')], \
        default = diDefault['difficulty'], \
        validators = [InputRequired()])
        type = StringField('Musical Type[s]: Comma separated list, like pavane, galliard', \
        default = diDefault['type'], \
        validators = [InputRequired(), type_val])
        source = StringField('Source: Name, or if a MS, library siglum + : + library name[s]', \
        default = diDefault['source'], \
        validators = [InputRequired(), source_val])
        document = StringField('Document: If a book, the title; if a ms, call sign (if any) + : + ms name', \
        default = diDefault['document'], \
        validators = [InputRequired(), Length(5, 40)])
        volume = StringField('Volume # (if any):', \
        default = diDefault['volume'], \
        validators = [Optional(), volume_val])
        date = StringField('Year 1000 to now. Can use "c", like c1605', \
        default = diDefault['date'], \
        validators = [InputRequired(),  Regexp('[c]?[12][0-9][0-9][0-9]', \
)])
        page = StringField('Comma-separated list of 1 or more pages. Skip the "p." or "f." part. Can use "%" or "#", followed by a number, like #17.', \

        default = diDefault['page'], \
        validators = [InputRequired(), page_val]) 
        section = StringField('Section Name (optional): Must start with a number + . + space, like 12. Galliard', \
        default = diDefault['section'], \
        validators = [ Optional(), section_val])
        editor = StringField('Editor (required):', \
        default = diDefault['editor'], \
        validators = [InputRequired(), Length(10, 40)])
        encoder = StringField('Encoder (required):', \
        default = diDefault['encoder'], \
        validators = [InputRequired(), Length(10, 40)])
        intabulator = StringField('Intabulator (optional):', \
        default = diDefault['intabulator'], \
        validators = [Optional(), Length(10, 40)])
        arranger = StringField('Arranger (optional):', \
        default = diDefault['arranger'], \
        validators = [Optional(), Length(10, 40)])
        contributor = StringField('Contributor (optional):', \
        default = diDefault['contributor'], \
        validators = [Optional(), Length(10, 40)])
        remarks = TextAreaField('Remarks: (optional)', \
        default = diDefault['remarks'], \
        validators = [Optional()])
        submit = SubmitField('Submit')
        btn_cancel = SubmitField(label='Cancel', \
        render_kw={'formnovalidate': True})
    return OutputForm()

class FileForm(FlaskForm):
    inputfile = StringField('Name of file to edit: ', \
    default = '', validators = [Length(0,40), input_val])
    submit = SubmitField('Submit')
    btn_directory= SubmitField(label='Directory', \
    render_kw={'formnovalidate': True})
    btn_cancel=SubmitField(label='Cancel', \
    render_kw={'formnovalidate': True})
