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

from core.utils.helper import timedelta_to_custom_format, duration_string_to_timedelta, format_amount_with_currency

from rest_framework.serializers import ModelSerializer
from rest_framework import serializers

from decimal import Decimal



class ProjectSerializer(ModelSerializer):
    total_hours = serializers.DurationField()
    class Meta:
        model = Project
        fields = ('id', 'name', 'total_hours',)

    def to_representation(self, instance):
        res = super().to_representation(instance)
        res['total_hours'] = timedelta_to_custom_format(duration_string_to_timedelta(res['total_hours']))

        return res


class ActivityTypeSerializer(ModelSerializer):
    activity_count = serializers.IntegerField()
    class Meta:
        model = ActivityType
        fields = ('id', 'name', 'activity_count',)


class UserSerializer(ModelSerializer):
    total_duration = serializers.DurationField()
    full_name = serializers.CharField(source='get_full_name', read_only=True)
    total_amount = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ('id', 'full_name', 'total_duration', 'total_amount',)

    def get_total_amount(self, instance):
        start_date = self.context.get("start_date")
        end_date = self.context.get("end_date")

        activities = instance.activity_set.filter(
            start_date_time__date__gte=start_date,
            start_date_time__date__lte=end_date)

        total_amount = sum(activity.total_duration.total_seconds() / 3600 * activity.pay_per_hour if activity.total_duration and activity.pay_per_hour else 0 for activity in activities)
        formatted_total_amount = format_amount_with_currency(total_amount)
        return formatted_total_amount

    def to_representation(self, instance):
        res = super().to_representation(instance)
        res['total_duration'] = timedelta_to_custom_format(duration_string_to_timedelta(res['total_duration']))

        return res
