from apps.authentication.api.v1.serializers.serializer import (
    UserSerializer,
    OrganizationSerializer,
    ProvinceSerializer,
    CitySerializer
)
from apps.herd.exception import HerdCapacityException
from apps.herd.models import Herd, Rancher
from rest_framework import serializers


class HerdSerializer(serializers.ModelSerializer):
    """ Herd Serializer """
    class Meta:
        model = Herd
        fields = '__all__'

    def validate(self, attrs):
        """ some validations for herd """

        if attrs['heavy_livestock_number'] + attrs['light_livestock_number'] > attrs['capacity']:
            raise HerdCapacityException()

        return attrs

    def to_representation(self, instance):
        """ Customize serializer output """
        representation = super().to_representation(instance)
        if isinstance(instance, Herd):
            if instance.owner:
                representation['owner'] = instance.owner.id
            representation['cooperative'] = OrganizationSerializer(instance.cooperative).data
            representation['province'] = ProvinceSerializer(instance.province).data
            representation['city'] = CitySerializer(instance.city).data
            if instance.contractor:
                representation['contractor'] = OrganizationSerializer(instance.contractor).data
            representation['rancher'] = RancherSerializer(instance.rancher).data

        return representation


class RancherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Rancher
        fields = '__all__'

    def to_representation(self, instance):
        """ customize output of serializer """

        representation = super().to_representation(instance)

        representation['province'] = {
            'id': instance.province.id,
            'name': instance.province.name
        }

        representation['city'] = {
            'id': instance.city.id,
            'name': instance.city.name
        }

        return representation
