from marshmallow import Schema, fields, validate

from ..validators import validate_datetime_greater_than_now


class TermOfDefenceSchema(Schema):
    start_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
    end_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
    project_supervisors = fields.List(fields.Integer(required=True), validate=validate.Length(3, 3))


class ProjectSupervisorForTermOfDefenceSchema(Schema):
    id = fields.Str()
    first_name = fields.Str()
    last_name = fields.Str()


class TermOfDefenceItemSchema(Schema):
    id = fields.Integer()
    start_date = fields.DateTime()
    end_date = fields.DateTime()
    members_of_committee = fields.List(fields.Nested(ProjectSupervisorForTermOfDefenceSchema))


class TermOfDefenceListSchema(Schema):
    term_of_defences = fields.List(fields.Nested(TermOfDefenceItemSchema))


class StudentDataItemSchema(Schema):
    index = fields.Integer()
    first_name = fields.Str()
    last_name = fields.Str()


class GroupDataItemSchema(Schema):
    name = fields.Str()
    students = fields.List(fields.Nested(StudentDataItemSchema))


class AssignedGroupToTermOfDefenceItemSchema(TermOfDefenceItemSchema):
    group = fields.Nested(GroupDataItemSchema)


class AssignedGroupToTermOfDefenceListSchema(Schema):
    term_of_defences = fields.List(fields.Nested(AssignedGroupToTermOfDefenceItemSchema))


class ProjectSupervisorForTemporaryAvailabilitySchema(Schema):
    id = fields.Str()
    first_name = fields.Str()
    last_name = fields.Str()


class TemporaryAvailabilityItemSchema(Schema):
    start_date = fields.DateTime()
    end_date = fields.DateTime()
    project_supervisor = fields.Nested(ProjectSupervisorForTemporaryAvailabilitySchema)


class TemporaryAvailabilityListSchema(Schema):
    temporary_availabilities = fields.List(fields.Nested(TemporaryAvailabilityItemSchema))