from marshmallow import fields as ma_fields, validate as ma_validate
from marshmallow.fields import Email
from teal import enums
from teal.marshmallow import EnumField, Phone, SanitizedStr

from ereuse_devicehub.marshmallow import NestedOn
from ereuse_devicehub.resources.models import STR_SIZE, STR_SM_SIZE
from ereuse_devicehub.resources.schemas import Thing


class Agent(Thing):
    id = ma_fields.UUID(dump_only=True)
    name = SanitizedStr(validate=ma_validate.Length(max=STR_SM_SIZE))
    tax_id = SanitizedStr(lower=True,
                          validate=ma_validate.Length(max=STR_SM_SIZE),
                          data_key='taxId')
    country = EnumField(enums.Country)
    telephone = Phone()
    email = Email()


class Organization(Agent):
    members = NestedOn('Membership')
    default_of = NestedOn('Inventory')


class Membership(Thing):
    organization = NestedOn(Organization)
    individual = NestedOn('Individual')
    id = SanitizedStr(lower=True, validate=ma_validate.Length(max=STR_SIZE))


class Individual(Agent):
    member_of = NestedOn(Membership, many=True)


class Person(Individual):
    pass


class System(Individual):
    pass