from rest_framework.serializers import ModelSerializer, Serializer
from rest_framework import serializers

from datetime import date

from apps.employee.models import ActivityType, Activity
from apps.user.models import User
from apps.project.models import Project



class ActivityTypeListSerializer(ModelSerializer):
    class Meta:
        model = ActivityType
        fields = ('id', 'name', 'is_location_required', 'deleted_at',)
        read_only_fields = fields


class ActivityTypeCreateSerializer(ModelSerializer):

    class Meta:
        model = ActivityType
        fields = ('id', 'name', 'is_location_required', 'is_active',)
        extra_kwargs = {
            'name': {'required': True},
            'is_location_required': {'required': True},
            'is_active' : {'required': True}
        }


class ActivityTypeDeleteSerializer(ModelSerializer):
    class Meta:
        model = ActivityType
        fields = ('id', 'name', 'is_location_required', 'is_active',)


class ActivityStartAPISerializer(Serializer):
    latitude = serializers.CharField(max_length=255)
    longitude = serializers.CharField(max_length=255)
    project_id = serializers.PrimaryKeyRelatedField(queryset=Project.objects.all())
    activity_type_id = serializers.PrimaryKeyRelatedField(queryset=ActivityType.objects.all())
    start_date_time = serializers.DateTimeField()
    end_date_time = serializers.DateTimeField(required=False, allow_null=True)
    description = serializers.CharField(required=False, allow_null=True)

    def validate(self, attrs):
        if 'end_date_time' in attrs and attrs['end_date_time'] and attrs['end_date_time'] <= attrs['start_date_time']:
            raise serializers.ValidationError({'end_date_time': "End date time should be greater than start date time."})

        if Activity.objects.filter(user=self.context['user'], start_date_time__date=date.today(), status='started').exists():
            raise serializers.ValidationError({'another_activity_in_process': "You have already another activity in process."})

        return super().validate(attrs)


class ActivityCompleteAPISerializer(Serializer):
    latitude = serializers.CharField(max_length=255, required=False, allow_null=True)
    longitude = serializers.CharField(max_length=255, required=False, allow_null=True)
    end_date_time = serializers.DateTimeField()

    def validate(self, attrs):
        if self.instance.status == 'completed':
            raise serializers.ValidationError({'already_completed': "Activity is already completed."})

        if 'end_date_time' in attrs and attrs['end_date_time'] and attrs['end_date_time'] <= self.instance.start_date_time:
            raise serializers.ValidationError({'end_date_time': "End date time should be greater than start date time."})

        return super().validate(attrs)


class ActivityTypeDetailSerializer(ModelSerializer):

    class Meta:
        model = ActivityType
        fields = ('id', 'name', 'is_location_required', 'is_active', 'deleted_at',)
        read_only_fields = fields


class ActivityEditSerializer(serializers.ModelSerializer):
    project_name = serializers.CharField(source='project.name', read_only=True)
    activity_type_name = serializers.CharField(source='activity_type.name', read_only=True)
    end_date_time = serializers.DateTimeField(allow_null=True, required=False)

    class Meta:
        model = Activity
        fields = ('id', 'project', 'project_name', 'activity_type', 'activity_type_name', 'start_date_time', 'end_date_time', 'description',)

    def validate(self, data):
        start_date = data.get('start_date_time')
        end_date = data.get('end_date_time')

        if start_date and end_date:
            if start_date > end_date:
                raise serializers.ValidationError("Start date cannot be later than end date.")
            data['total_duration'] = end_date - start_date

        return data


class ActivityDetailSerialzier(serializers.ModelSerializer):
    project_name = serializers.CharField(source='project.name', read_only=True)
    activity_type_name = serializers.CharField(source='activity_type.name', read_only=True)

    class Meta:
        model = Activity
        fields = ('id', 'project', 'project_name', 'activity_type', 'activity_type_name', 'start_date_time', 'end_date_time', 'description', 'deleted_at',)


class ActivityDeleteAPISerializer(serializers.ModelSerializer):
    class Meta:
        model = Activity
        fields = ('id', 'project', 'activity_type', 'start_date_time', 'end_date_time')
        read_only_fields = fields