from marshmallow import fields as f

from ereuse_devicehub.marshmallow import NestedOn
from ereuse_devicehub.resources.deliverynote import models as m
from ereuse_devicehub.resources.enums import TransferState
from ereuse_devicehub.resources.models import STR_SIZE
from ereuse_devicehub.resources.schemas import Thing
from ereuse_devicehub.resources.user import schemas as s_user
from ereuse_devicehub.teal.marshmallow import EnumField, SanitizedStr


class Deliverynote(Thing):
    id = f.UUID(dump_only=True)
    document_id = SanitizedStr(
        validate=f.validate.Length(max=STR_SIZE), required=True, data_key='documentID'
    )
    creator = NestedOn(s_user.User, dump_only=True)
    supplier_email = SanitizedStr(
        validate=f.validate.Length(max=STR_SIZE),
        load_only=True,
        required=True,
        data_key='supplierEmail',
    )
    supplier = NestedOn(s_user.User, dump_only=True)
    receiver = NestedOn(s_user.User, dump_only=True)
    date = f.DateTime('iso', required=True)
    amount = f.Integer(
        validate=f.validate.Range(min=0, max=100),
        description=m.Deliverynote.amount.__doc__,
    )
    expected_devices = f.List(f.Dict, required=True, data_key='expectedDevices')
    transferred_devices = f.List(
        f.Integer(), required=False, data_key='transferredDevices'
    )
    transfer_state = EnumField(TransferState, description=m.Lot.transfer_state.comment)