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 wtforms.validators import InputRequired, Length, NumberRange, Optional, Regexp, ValidationError, InputRequired, DataRequired
from vals import *
import platform, re, readline
unput()
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]
diValues = find_values()
    

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


class FronForm(FlaskForm):
    myname = StringField('Full name (first and last):', \
    default = 'Frank', validators=[Length(1, 40), name_val])
    stInfile = StringField('File to edit (.ft3 ending optional):', \
    default = diValues['stInfile'], validators=[Length(0, 60), input_val])
    title = StringField('Title:',\
    default = diValues['title'], validators=[InputRequired(), Length(3, 40)])
    subtitle = StringField('Subtitle:',\
    default = diValues['subtitle'], validators=[Optional(), Length(3, 40)])
    composer = StringField('Composer:',\
    default = diValues['composer'], validators=[InputRequired(), Length(2,40)])
    composer0 = StringField('Original composer (optional):', \
    default = diValues['composer0'], validators=[Optional(), Length(2,40)])
    ensemble = StringField('Ensemble (comma-separated list of instruments or voices):', \
    default = diValues['composer0'], validators=[InputRequired(), ensemble_val])
    part = StringField('Part ("score", or comma-separated list of instruments or voices):', \
    default = diValues['composer0'], validators=[InputRequired(), ensemble_val])
    key = StringField('Comma-separated list of keys, like Abm, EM:', \
    default = diValues['composer0'], validators=[InputRequired(), key_val])
    difficulty = RadioField('Difficulty (choose one):', \
    choices=[('0', 'Beginner'), ('1', 'Easy'), ('2', 'Medium'), ('3', 'Challenging'), ('4', 'Hard'), ('5', 'Virtuoso')], \
    default = diValues['difficulty'], validators = [InputRequired()])
    type = StringField('Musical Type[s]: Comma separated list, like pavane, galliard', \
    default = diValues['composer0'], validators=[InputRequired(), type_val])
    source = StringField('Source: Name, or if a MS, library siglum + : + library name[s]', \
    default = diValues['composer0'],validators=[InputRequired(), source_val])
    document = StringField('Document: If a book, the title; if a ms, call sign (if any) + : + ms name', \
            default = diValues['document'], validators=[InputRequired(), Length(5, 40)])
    volume = IntegerField('Volume # (if any):', \
    default = diValues['volume'], validators = [Optional(), NumberRange(min=1, max=99)])
    date = StringField('Year 1000 to now. Can use "c", like c1605', \
    default=diValues['date'], validators = [InputRequired(), \
    Regexp('[c]?[12][0-9][0-9][0-9]', \
    message='Year 1000 to now. Can use "c", like c1605')])
    page = StringField('Comma-separated list of pages, like 13, 14v, b3v, 15b (2nd piece starting on p. 15)', \
    default = diValues['page'], validators = [InputRequired(), page_val]) 
    section = StringField('Section Name (optional): Must start with a number + . + space, like 12. Galliard', \
    default = diValues['section'], validators=[ Optional(), section_val])
    editor = StringField('Editor:', \
    default = diValues['editor'], validators=[InputRequired(), Length(10, 40)])
    encoder = StringField('Encoder:', \
    default = diValues['encoder'], validators=[InputRequired(), Length(10, 40)])
    intabulator = StringField('Intabulator:', \
    default = diValues['intabulaor'], validators=[InputRequired(), Length(10, 40)])
    arranger = StringField('Arranger (optional):', \
    default = diValues['arranger'], validators=[Optional(), Length(10, 40)])
    contributor = StringField('Contributor (optional):', \
    default = diValues['contributor'], validators=[Optional(), Length(10, 40)])
    remarks = TextAreaField('Remarks: (optional)', \
    default = diValues['remarks'], validators=[Optional()])
    outputfile = StringField('File to write this to:', \
    default = diValues['outputfile'], validators=[Length(1, 60), output_val])
    submit = SubmitField('Submit')
    btn_cancel = SubmitField(label='Cancel', render_kw={'formnovalidate': True})
