import bitmath

from marshmallow import fields, Schema


class StorageUnit(fields.Field):
    def _serialize(self, value, attr, obj, **kwargs):
        return str(value)

    def _deserialize(self, value, attr, data, **kwargs):
        return bitmath.parse_string_unsafe(value)


class SpecsSchema(Schema):
    cpu = fields.Int()
    ram = StorageUnit()
    os_ssd = StorageUnit(data_key="os-ssd", attribute="os-ssd")
    hdd = fields.List(StorageUnit())


class VMSchema(Schema):
    name = fields.Str()
    owner = fields.Str()
    owner_realm = fields.Str()
    specs = fields.Nested(SpecsSchema)
    status = fields.Str()
    log = fields.List(fields.Str())
    vnc_socket = fields.Str()
    image_uuid = fields.Str()
    hostname = fields.Str()
    metadata = fields.Dict()
    network = fields.List(
        fields.Tuple((fields.Str(), fields.Str(), fields.Int()))
    )
    in_migration = fields.Bool()


class NetworkSchema(Schema):
    _id = fields.Int(data_key="id", attribute="id")
    _type = fields.Str(data_key="type", attribute="type")
    ipv6 = fields.Str()