# Copyright (C) 2020-2024 Soleta Networks <info@soleta.eu>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

from wtforms import (
    Form, SubmitField, HiddenField, SelectField, BooleanField, IntegerField,
    StringField, RadioField, FormField, FieldList, DecimalField, TextAreaField,
    SelectMultipleField
)
from wtforms.validators import InputRequired
from flask_wtf import FlaskForm
from flask_babel import lazy_gettext as _l
from flask_babel import _


class GenericForm(FlaskForm):
    ips = HiddenField()
    ids = HiddenField()
    server = HiddenField()
    submit = SubmitField(label=_l('Submit'))


class WOLForm(FlaskForm):
    ips = HiddenField()
    wol_type = SelectField(label=_l('Type'),
                           choices=[('broadcast', 'Broadcast'),
                                    ('unicast', 'Unicast')])
    submit = SubmitField(label=_l('Submit'))

class PartitionForm(FlaskForm):
    partition = IntegerField(label=_l('Partition'),
                             render_kw={'readonly': True},
                             default=1)
    part_type = SelectField(label=_l('Type'),
                            validators=[InputRequired()],
                            choices=[('LINUX', 'Linux'),
                                     ('NTFS', 'NTFS'),
                                     ('CACHE', 'CACHE'),
                                     ('EFI', 'EFI'),
                                     ('DATA', 'DATA'),
                                     ('LINUX-SWAP', 'LINUX-SWAP'),
                                     ('EXTENDED', 'EXTENDED'),
                                     ('FAT32', 'FAT32'),
                                     ('LINUX-LVM', 'LINUX-LVM'),
                                     ('LINUX-RAID', 'LINUX-RAID'),
                                     ('WIN-RECOV', 'WIN-RECOV'),
                                     ('HNTFS', 'HNTFS'),
                                     ('HFAT32', 'HFAT32'),
                                     ('HNTFS-WINRE', 'HNTFS-WINRE'),
                                     ('EMPTY', 'Empty')],
                            default='EMPTY')
    fs = SelectField(label=_l('Filesystem'),
                     validators=[InputRequired()],
                     choices=[('EXT4', 'EXT4'),
                              ('NTFS', 'NTFS'),
                              ('CACHE', 'CACHE'),
                              ('LINUX-SWAP', 'LINUX-SWAP'),
                              ('FAT32', 'FAT32'),
                              ('EMPTY', 'Empty')],
                     default='EMPTY')
    size = IntegerField(label=_l('Size (KB)'), validators=[InputRequired()],)

class SelectClientForm(FlaskForm):
    ips = HiddenField()
    selected_client = SelectField(label=_l('Select one client as reference to '
                                           'define the partition scheme'))
    submit = SubmitField(label=_l('Select'))

class SetupForm(FlaskForm):
    ips = HiddenField()
    disk = SelectField(label='Disk', validate_choice=False)
    disk_type = SelectField(label=_l('Type'),
                            choices=[('MSDOS', 'MBR'),
                                     ('GPT', 'GPT')])
    partitions = FieldList(FormField(PartitionForm),
                           min_entries=1,
                           max_entries=16)

class HardwareForm(FlaskForm):
    ips = HiddenField()
    refresh = SubmitField(label=_l('Refresh'))

class SoftwareForm(FlaskForm):
    ips = HiddenField()
    os = SelectField(label=_l('Partition'), choices=[])
    view = SubmitField(label=_l('View'))
    update = SubmitField(label=_l('Update'))

class SessionForm(FlaskForm):
    ips = HiddenField()
    os = RadioField(label=_l('Session'), choices=[])

class CacheImage(FlaskForm):
    selected = BooleanField()
    image_name = HiddenField()
    clients = HiddenField()

class CacheForm(FlaskForm):
    ips = HiddenField()
    images = FieldList(FormField(CacheImage))

class ImageRestoreForm(FlaskForm):
    ips = HiddenField()
    partition = SelectField(label=_l('Partition'), choices=[])
    image = SelectField(label=_l('Image'), choices=[])
    method = SelectField(label=_l('Method'),
                         choices=[('TIPTORRENT', 'TIPTORRENT'),
                                  ('UNICAST', 'UNICAST'),
                                  ('UNICAST-DIRECT', 'UNICAST-DIRECT')])
    restore = SubmitField(label=_l('Restore'))

class ImageFetchForm(FlaskForm):
    ips = HiddenField()
    image = SelectField(label=_l('Image'), choices=[])
    method = SelectField(label=_l('Method'),
                         choices=[('TIPTORRENT', 'TIPTORRENT'),
                                  ('UNICAST', 'UNICAST')])
    submit = SubmitField(label=_l('Submit'))

class RepoForm(FlaskForm):
    server = HiddenField()
    repo_id = HiddenField()
    name = StringField(label=_l('Name'))
    addr = FieldList(
        StringField(label=_l('Address')),
        label=_l('Addresses'),
    )
    submit = SubmitField(label=_l('Submit'))

class FolderForm(FlaskForm):
    folder_id = HiddenField()
    server = HiddenField()
    room = HiddenField()
    center = HiddenField()
    name = StringField(label=_l('Name'))
    submit = SubmitField(label=_l('Submit'))

class ClientDetailsForm(FlaskForm):
    server = HiddenField()
    client_id = HiddenField()
    name = StringField(label=_l('Name'),
                       validators=[InputRequired()])
    ip = StringField(label=_l('IP'),
                     validators=[InputRequired()])
    mac = StringField(label=_l('MAC'),
                      validators=[InputRequired()])
    serial_number = StringField(label=_l('Serial Number'))
    livedir = SelectField(label=_l('ogLive'),
                          choices=[('ogLive', 'Default'),])
    remote = BooleanField(label=_l('Remote'))
    maintenance = BooleanField(label=_l('Maintenance'))
    repo = SelectField(label=_l('Repository'), validate_choice=False)
    room = SelectField(label=_l('Room'), validate_choice=False)
    folder_id = HiddenField()
    boot = SelectField(label=_l('Boot Mode'), validate_choice=False)
    submit = SubmitField(label=_l('Submit'))

class ClientMoveForm(FlaskForm):
    ips = HiddenField()
    scopes = SelectField(label=_l('Scopes'), validate_choice=False)
    submit = SubmitField(label=_l('Submit'))

class RunScriptForm(FlaskForm):
    ips = HiddenField()
    script = SelectField(label=_l('Script'),
                                  choices=[],
                                  validators=[InputRequired()],
                                  validate_choice=False)
    arguments = StringField(label=_l('Arguments'))
    submit = SubmitField(label=_l('Submit'))

class RunCmdForm(FlaskForm):
    ips = HiddenField()
    command = StringField(label=_l('Command'))
    submit = SubmitField(label=_l('Submit'))

class ImportClientsForm(FlaskForm):
    server = HiddenField()
    room = SelectField(label=_l('Room'))
    repo = SelectField(label=_l('Repository'))
    client_conf = TextAreaField(label=_l('Client configuration'))
    import_btn = SubmitField(label=_l('Import'))

class BootModeForm(FlaskForm):
    ips = HiddenField()
    boot = SelectField(label=_l('Boot mode'))
    ok = SubmitField(label=_l('Submit'))

class OgliveForm(FlaskForm):
    ips = HiddenField()
    server = HiddenField()
    oglive = SelectField(label=_l('ogLive'))
    ok = SubmitField(label=_l('Submit'))

class SetRepoForm(FlaskForm):
    ips = HiddenField()
    repo = SelectField(label=_l('Repository'))
    ok = SubmitField(label=_l('Submit'))

class ImageCreateForm(FlaskForm):
    ip = HiddenField()
    os = SelectField(label=_l('Partition'), choices=[])
    name = StringField(label=_l('Image name'),
                       validators=[InputRequired()])
    description = StringField(label=_l('Description'))
    repository = SelectField(label=_l('Repository'), choices=[],
                             validators=[InputRequired()])
    create = SubmitField(label=_l('Create'))


class ImageUpdateForm(FlaskForm):
    ip = HiddenField()
    os = SelectField(label=_l('Partition'), choices=[])
    image = SelectField(label=_l('Image'), choices=[])
    backup = BooleanField(label=_l('Backup'))
    update = SubmitField(label=_l('Update'))


class CenterForm(FlaskForm):
    server = SelectField(label=_l('Server'),
                         validators=[InputRequired()])
    center = HiddenField()
    name = StringField(label=_l('Center name'),
                       validators=[InputRequired()])
    comment = StringField(label=_l('Comment'))
    submit = SubmitField(label=_l('Submit'))

class DeleteCenterForm(FlaskForm):
    server = HiddenField()
    center = HiddenField()
    submit = SubmitField(label=_l('Submit'))

class RoomForm(FlaskForm):
    server = HiddenField()
    room = HiddenField()
    center = SelectField(label=_l('Center'),
                         validators=[InputRequired()])
    name = StringField(label=_l('Room name'),
                       validators=[InputRequired()])
    netmask = StringField(label=_l('Netmask'),
                          validators=[InputRequired()])
    gateway = StringField(label=_l('Gateway'),
                          validators=[InputRequired()])
    folder_id = HiddenField()
    submit = SubmitField(label=_l('Submit'))

class DeleteRoomForm(FlaskForm):
    server = HiddenField()
    room = HiddenField()
    submit = SubmitField(label=_l('Submit'))

class ImageDetailsForm(FlaskForm):
    name = StringField(label=_l('Name'))
    description = StringField(label=_l('Description'))
    size = DecimalField(label=_l('Size (MiB)'))
    datasize = DecimalField(label=_l('Datasize (MiB)'))
    modified = StringField(label=_l('Last update'))
    permissions = StringField(label=_l('Permissions'))
    software_id = StringField(label=_l('Software id'))
    checksum = StringField(label=_l('Checksum'))
    scopes = SelectMultipleField(
        label=_l('Allowed scopes'),
        description=_l('No scope selection gives full access'),
    )

class ImageConfigForm(FlaskForm):
    image_id = HiddenField()
    server = HiddenField()
    name = HiddenField()
    scopes = SelectMultipleField(
        label=_l('Allowed scopes'),
        description=_l('No scope selection gives full access'),
    )
    submit = SubmitField(label=_l('Submit'))

class ServerForm(FlaskForm):
    name = StringField(label=_l('Name'),
                       validators=[InputRequired()])
    ip = StringField(label=_l('IP'),
                     validators=[InputRequired()])
    port = StringField(label=_l('Port'),
                     validators=[InputRequired()])
    api_token = StringField(label=_l('API token'),
                     validators=[InputRequired()])
    submit = SubmitField(label=_l('Submit'))

class ServerConfigurationForm(FlaskForm):
    server_addr = HiddenField()
    addr = FieldList(
        StringField(label=_l('Address')),
        label=_l('Addresses'),
    )
    submit = SubmitField(label=_l('Submit'))

class DeleteRepositoryForm(FlaskForm):
    repository = SelectField(label=_l('Repository'),
                             validators=[InputRequired()])
    submit = SubmitField(label=_l('Submit'))
