from django.utils import timezone
from rest_framework import serializers

from files.models import File
from inventory.models import Event, Container, Item
from mail.models import EventAddress


class EventAdressSerializer(serializers.ModelSerializer):
    class Meta:
        model = EventAddress
        fields = ['address']


class EventSerializer(serializers.ModelSerializer):
    addresses = EventAdressSerializer(many=True, required=False)

    class Meta:
        model = Event
        fields = ['eid', 'slug', 'name', 'start', 'end', 'pre_start', 'post_end', 'addresses']
        read_only_fields = ['eid']


class ContainerSerializer(serializers.ModelSerializer):
    itemCount = serializers.SerializerMethodField()

    class Meta:
        model = Container
        fields = ['cid', 'name', 'itemCount']
        read_only_fields = ['cid', 'itemCount']

    def get_itemCount(self, instance):
        return Item.objects.filter(container=instance.cid).count()


class ItemSerializer(serializers.ModelSerializer):
    dataImage = serializers.CharField(write_only=True, required=False)
    cid = serializers.SerializerMethodField()
    box = serializers.SerializerMethodField()
    file = serializers.SerializerMethodField()
    returned = serializers.SerializerMethodField(required=False)

    class Meta:
        model = Item
        fields = ['cid', 'box', 'uid', 'description', 'file', 'dataImage', 'returned']
        read_only_fields = ['uid']

    def get_cid(self, instance):
        return instance.container.cid

    def get_box(self, instance):
        return instance.container.name

    def get_file(self, instance):
        if len(instance.files.all()) > 0:
            return instance.files.all().order_by('-created_at')[0].hash
        return None

    def get_returned(self, instance):
        return instance.returned_at is not None

    def to_internal_value(self, data):
        container = None
        returned = False
        if 'cid' in data:
            container = Container.objects.get(cid=data['cid'])
        if 'returned' in data:
            returned = data['returned']
        internal = super().to_internal_value(data)
        if container:
            internal['container'] = container
        if returned:
            internal['returned_at'] = timezone.now()
        return internal

    def validate(self, attrs):
        return super().validate(attrs)

    def create(self, validated_data):
        if 'dataImage' in validated_data:
            file = File.objects.create(data=validated_data['dataImage'])
            validated_data.pop('dataImage')
            item = Item.objects.create(**validated_data)
            item.files.set([file])
            return item
        return Item.objects.create(**validated_data)

    def update(self, instance, validated_data):
        if 'returned' in validated_data:
            if validated_data['returned']:
                validated_data['returned_at'] = timezone.now()
            validated_data.pop('returned')
        if 'dataImage' in validated_data:
            file = File.objects.create(data=validated_data['dataImage'])
            validated_data.pop('dataImage')
            instance.files.add(file)
        return super().update(instance, validated_data)