import app.core.schemas as schemas
import app.database.models as models
from app.core import ma
from marshmallow_sqlalchemy import fields


class RichSchema(ma.SQLAlchemySchema):
    class Meta:
        strict = True
        load_instance = True
        include_relationships = True


class QuestionSchemaRich(RichSchema):
    class Meta(RichSchema.Meta):
        model = models.Question

    id = ma.auto_field()
    name = ma.auto_field()
    total_score = ma.auto_field()
    slide_id = ma.auto_field()
    type_id = ma.auto_field()
    alternatives = fields.Nested(schemas.QuestionAlternativeSchema, many=True)


class TeamSchemaRich(RichSchema):
    class Meta(RichSchema.Meta):
        model = models.Team

    id = ma.auto_field()
    name = ma.auto_field()
    competition_id = ma.auto_field()
    question_answers = fields.Nested(schemas.QuestionAnswerSchema, many=True)


class SlideSchemaRich(RichSchema):
    class Meta(RichSchema.Meta):
        model = models.Slide

    id = ma.auto_field()
    order = ma.auto_field()
    title = ma.auto_field()
    timer = ma.auto_field()
    competition_id = ma.auto_field()
    questions = fields.Nested(QuestionSchemaRich, many=True)
    components = fields.Nested(schemas.ComponentSchema, many=True)


class CompetitionSchemaRich(RichSchema):
    class Meta(RichSchema.Meta):
        model = models.Competition

    id = ma.auto_field()
    name = ma.auto_field()
    year = ma.auto_field()
    city_id = ma.auto_field()
    slides = fields.Nested(
        SlideSchemaRich,
        many=True,
    )
    teams = fields.Nested(TeamSchemaRich, many=True)