from flask_wtf import FlaskForm
from wtforms.fields import DateField, SubmitField, TextAreaField
from wtforms.validators import DataRequired, Optional

from .model_dependent_funs import selection_mark_field


class AssistantGroupExperimentFormBase(FlaskForm):
    submit = SubmitField(label="Save")


def assistant_group_experiment_form_factory(current_user, group_experiment):
    class AssistantGroupExperimentForm(AssistantGroupExperimentFormBase):
        note = TextAreaField(
            "Note",
            default=group_experiment.note,
            validators=[Optional()],
        )

    appointments = group_experiment.appointments
    appointment_num = 1
    for appointment in appointments:
        description = "Yes" if appointment.special else "No"

        setattr(
            AssistantGroupExperimentForm,
            "appointment_" + str(appointment_num),
            DateField(
                str(appointment_num),
                default=appointment.date,
                validators=[DataRequired()],
                description=description,
            ),
        )
        appointment_num += 1

    experiment_marks = group_experiment.experiment_marks
    experiment_mark_num = 1
    for experiment_mark in experiment_marks:
        setattr(
            AssistantGroupExperimentForm,
            "oral_experiment_mark_" + str(experiment_mark_num),
            selection_mark_field("Oral", experiment_mark.oral_mark),
        )
        setattr(
            AssistantGroupExperimentForm,
            "protocol_experiment_mark_" + str(experiment_mark_num),
            selection_mark_field("Protocol", experiment_mark.protocol_mark),
        )
        experiment_mark_num += 1

    return (AssistantGroupExperimentForm(), appointments, experiment_marks)