from flask_wtf import FlaskForm
from flask_wtf.file import FileAllowed, FileRequired
from wtforms import StringField, PasswordField, SubmitField, BooleanField, FileField, RadioField, DateTimeField
from wtforms.validators import DataRequired, ValidationError, Length
from flask_babel import lazy_gettext as _l
import re
from wtforms.widgets import PasswordInput

def hostname_check(form, field):
    regex= re.compile("[a-zA-Z0-9-_]+")
    matches = re.fullmatch(regex, field.data)
    if not matches:
        raise ValidationError(_l('Only dashes, underscores, letters and numbers allowed.'))

def wifi_length_check(form, field):
    if len(field.data) > 63:
        raise ValidationError(_l('Wifi password cannot be longer than 63 characters.'))
    if len(field.data) in range(1,8):
        raise ValidationError(_l('Wifi password cannot be shorter than 8 characters.'))

class LoginForm(FlaskForm):
    username = StringField(_l('Username'), validators=[DataRequired()])
    password = PasswordField(_l('Password'), validators=[DataRequired()])
    submit = SubmitField(_l('Sign In'))
    remember_me = BooleanField('Remember Me')

class Step1Form(FlaskForm):
    enable_file_viewer = BooleanField(_l('Enable File Viewer'))
    enable_chat = BooleanField(_l('Enable Chat'))
    enable_deltachat = BooleanField(_l('Enable DeltaChat'))
    submit = SubmitField(_l('Next'))

class Step2Form(FlaskForm):
    butterbox_name = StringField(_l('Butterbox Name'), validators=[DataRequired()])
    butterbox_logo = FileField((_l('Butterbox Logo')), validators=[FileAllowed(['jpg', 'png', 'svg'], _l('Images only!'))])
    butterbox_hostname = StringField(_l('Butterbox Hostname'), validators=[DataRequired(), Length(1, 64), hostname_check])
    butterbox_date = DateTimeField(_l('Butterbox Date'), format='%Y-%m-%dT%H:%M:%SZ')

    submit = SubmitField(_l('Next'))

class Step3Form(FlaskForm):
    ssid = StringField(_l('WiFi Name'), validators=[DataRequired(), Length(1, 64), hostname_check])
    wifi_password = StringField(_l('WiFi Password'), validators=[wifi_length_check])
    enable_wifi_sharing = BooleanField(_l('Enable WiFi Sharing'))
    enable_access_point = BooleanField(_l('Enable Access Point'))
    submit = SubmitField(_l('Next'))

class Step4Form(FlaskForm):
    admin_password =  StringField(_l('Admin Password'), widget=PasswordInput(hide_value=False))
    root_password = StringField(_l('Root Password'), widget=PasswordInput(hide_value=False), validators=[DataRequired()])
    root_account_settings= RadioField(_l('Secure Root Account Method'), choices=[ ('lock_root_account', _l('Lock root account')), ( 'set_root_password', _l('Use root password'))], validators=[DataRequired()])
    ssh_access_settings = RadioField(_l('SSH Access Method'), choices=[ ('disable_ssh', _l('Disable SSH')), ( 'enable_ssh_with_root_password', _l('Enable SSH with root password')), ], validators=[DataRequired()])
    # ('enable_ssh_with_public_key', 'Enable SSH with public key'),
    lock_root_account = BooleanField(_l('Lock Root Account'))
    submit = SubmitField(_l('Apply Changes'))


class SettingsForm(FlaskForm):
    # Access point settings
    ssid = StringField(_l('SSID'), validators=[DataRequired(), Length(1, 64), hostname_check])
    wifi_password = StringField(_l('WiFi Password'), validators=[wifi_length_check])
    enable_access_point = BooleanField(_l('Enable Access Point'))
    # Customisation settings
    butterbox_name = StringField(_l('Butterbox Name'), validators=[DataRequired()])
    butterbox_logo = FileField((_l('Butterbox Logo')), validators=[FileAllowed(['jpg', 'png', 'svg'], _l('Images only!'))])
    # Services settings
    enable_file_viewer = BooleanField(_l('Enable File Viewer'))
    enable_chat = BooleanField(_l('Enable Chat'))
    enable_deltachat = BooleanField(_l('Enable DeltaChat'))
    enable_wifi_sharing = BooleanField(_l('Enable WiFi Sharing'))
    # Access Settings
    admin_password =  StringField(_l('Admin Password'), widget=PasswordInput(hide_value=False))
    root_password = StringField(_l('Root Password'), widget=PasswordInput(hide_value=False), validators=[DataRequired()])

    root_account_settings= RadioField(_l('Secure Root Account Method'), choices=[('lock_root_account', _l('Lock root account')), ( 'set_root_password', _l('Use root password'))], validators=[DataRequired()])
    ssh_access_settings = RadioField(_l('SSH Access Method'), choices=[ ('disable_ssh', _l('Disable SSH')), ( 'enable_ssh_with_root_password', _l('Enable SSH with root password')), ], validators=[DataRequired()])
    # ('enable_ssh_with_public_key', 'Enable SSH with public key'),
    lock_root_account = BooleanField(_l('Lock Root Account'))
    submit = SubmitField(_l('Submit'))
    apply_changes = SubmitField(_l('Apply Changes'))
