import decimal

from django.utils.translation import gettext as _
from rest_framework import serializers

from dcim.choices import *
from dcim.models import DeviceType, ModuleType, ModuleTypeProfile
from netbox.api.fields import AttributesField, ChoiceField, RelatedObjectCountField
from netbox.api.serializers import NetBoxModelSerializer
from netbox.choices import *
from .manufacturers import ManufacturerSerializer
from .platforms import PlatformSerializer

__all__ = (
    'DeviceTypeSerializer',
    'ModuleTypeProfileSerializer',
    'ModuleTypeSerializer',
)


class DeviceTypeSerializer(NetBoxModelSerializer):
    manufacturer = ManufacturerSerializer(nested=True)
    default_platform = PlatformSerializer(nested=True, required=False, allow_null=True)
    u_height = serializers.DecimalField(
        max_digits=4,
        decimal_places=1,
        label=_('Position (U)'),
        min_value=decimal.Decimal(0),
        default=1.0
    )
    subdevice_role = ChoiceField(choices=SubdeviceRoleChoices, allow_blank=True, required=False, allow_null=True)
    airflow = ChoiceField(choices=DeviceAirflowChoices, allow_blank=True, required=False, allow_null=True)
    weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True)
    front_image = serializers.ImageField(required=False, allow_null=True)
    rear_image = serializers.ImageField(required=False, allow_null=True)

    # Counter fields
    console_port_template_count = serializers.IntegerField(read_only=True)
    console_server_port_template_count = serializers.IntegerField(read_only=True)
    power_port_template_count = serializers.IntegerField(read_only=True)
    power_outlet_template_count = serializers.IntegerField(read_only=True)
    interface_template_count = serializers.IntegerField(read_only=True)
    front_port_template_count = serializers.IntegerField(read_only=True)
    rear_port_template_count = serializers.IntegerField(read_only=True)
    device_bay_template_count = serializers.IntegerField(read_only=True)
    module_bay_template_count = serializers.IntegerField(read_only=True)
    inventory_item_template_count = serializers.IntegerField(read_only=True)

    # Related object counts
    device_count = RelatedObjectCountField('instances')

    class Meta:
        model = DeviceType
        fields = [
            'id', 'url', 'display_url', 'display', 'manufacturer', 'default_platform', 'model', 'slug', 'part_number',
            'u_height', 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'airflow', 'weight',
            'weight_unit', 'front_image', 'rear_image', 'description', 'comments', 'tags', 'custom_fields',
            'created', 'last_updated', 'device_count', 'console_port_template_count',
            'console_server_port_template_count', 'power_port_template_count', 'power_outlet_template_count',
            'interface_template_count', 'front_port_template_count', 'rear_port_template_count',
            'device_bay_template_count', 'module_bay_template_count', 'inventory_item_template_count',
        ]
        brief_fields = ('id', 'url', 'display', 'manufacturer', 'model', 'slug', 'description', 'device_count')


class ModuleTypeProfileSerializer(NetBoxModelSerializer):

    class Meta:
        model = ModuleTypeProfile
        fields = [
            'id', 'url', 'display_url', 'display', 'name', 'description', 'schema', 'comments', 'tags', 'custom_fields',
            'created', 'last_updated',
        ]
        brief_fields = ('id', 'url', 'display', 'name', 'description')


class ModuleTypeSerializer(NetBoxModelSerializer):
    profile = ModuleTypeProfileSerializer(
        nested=True,
        required=False,
        allow_null=True
    )
    manufacturer = ManufacturerSerializer(
        nested=True
    )
    weight_unit = ChoiceField(
        choices=WeightUnitChoices,
        allow_blank=True,
        required=False,
        allow_null=True
    )
    airflow = ChoiceField(
        choices=ModuleAirflowChoices,
        allow_blank=True,
        required=False,
        allow_null=True
    )
    attributes = AttributesField(
        source='attribute_data',
        required=False,
        allow_null=True
    )

    class Meta:
        model = ModuleType
        fields = [
            'id', 'url', 'display_url', 'display', 'profile', 'manufacturer', 'model', 'part_number', 'airflow',
            'weight', 'weight_unit', 'description', 'attributes', 'comments', 'tags', 'custom_fields', 'created',
            'last_updated',
        ]
        brief_fields = ('id', 'url', 'display', 'profile', 'manufacturer', 'model', 'description')
