from rest_framework import serializers
from apps.companies.models import ServicePrice, Service


class MinimumServicePriceSerializer(serializers.ModelSerializer):

    class Meta:
        model = ServicePrice
        fields = [
            "base_price",
        ]

class ServicePriceSerializer(serializers.ModelSerializer):
    company = serializers.HiddenField(default=None)
    is_active = serializers.BooleanField(read_only=True)
    total_price = serializers.DecimalField(
        max_digits=10, decimal_places=2, read_only=True
    )
    estimated_hours = serializers.DecimalField(
        max_digits=10,
        decimal_places=0,
    )

    class Meta:
        model = ServicePrice
        fields = [
            "id",
            "service",
            "company",
            "base_price",
            "labor_rate_per_hour",
            "estimated_hours",
            "currency",
            "effective_from",
            "effective_to",
            "is_active",
            "starting_at",
            "total_price",
        ]

class ServiceListSerializer(serializers.ModelSerializer):
    service_price = serializers.SerializerMethodField()
    labor_rate_per_hour = serializers.SerializerMethodField()
    estimated_hours = serializers.SerializerMethodField()

    class Meta:
        model = Service
        fields = [
            "id",
            "name",
            "description",
            "is_active",
            "service_price",
            'labor_rate_per_hour',
            'estimated_hours',
        ]

    def get_service_price(self, obj):
        company = self.context["request"].user.active_company

        price = obj.prices.filter(
            company=company,
            is_active=True
        ).order_by("-effective_from").first()

        return price.base_price if price else None

    def get_labor_rate_per_hour(self, obj):
        company = self.context["request"].user.active_company

        price = obj.prices.filter(
            company=company,
            is_active=True
        ).order_by("-effective_from").first()

        return price.labor_rate_per_hour if price and price.labor_rate_per_hour else None

    def get_estimated_hours(self, obj):
        company = self.context["request"].user.active_company

        price = obj.prices.filter(
            company=company,
            is_active=True
        ).order_by("-effective_from").first()

        return int(price.estimated_hours) if price and price.estimated_hours else None

class ServiceSerializer(serializers.ModelSerializer):
    code = serializers.CharField(read_only=True)
    company = serializers.HiddenField(default=None)
    current_price = serializers.SerializerMethodField()

    class Meta:
        model = Service
        fields = [
            "id",
            "name",
            "code",
            "description",
            "is_active",
            "company",
            "current_price",
        ]

    def get_current_price(self, obj):
        company = self.context["request"].user.active_company

        price = obj.prices.filter(
            company=company,
            is_active=True
        ).order_by("-effective_from").first()

        return ServicePriceSerializer(price).data if price else None

class ServicePriceInputSerializer(serializers.Serializer):
    base_price = serializers.DecimalField(max_digits=10, decimal_places=2)
    labor_rate_per_hour = serializers.DecimalField(
        max_digits=10,
        decimal_places=2,
        required=False,
        allow_null=True
    )
    estimated_hours = serializers.DecimalField(
        max_digits=5,
        decimal_places=2,
        required=False,
        allow_null=True
    )
    currency = serializers.CharField(default="USD")
    starting_at = serializers.BooleanField(default=False)
    effective_from = serializers.DateField(required=False, allow_null=True)
    effective_to = serializers.DateField(required=False, allow_null=True)

class ServiceWithPriceSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=100)
    description = serializers.CharField(
        required=False,
        allow_blank=True,
        allow_null=True
    )
    price = ServicePriceInputSerializer(required=True)

    def create(self, validated_data):
        return validated_data

class ServiceWithPriceUpdateSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=100, required=False)
    description = serializers.CharField(
        required=False,
        allow_blank=True,
        allow_null=True
    )
    is_active = serializers.BooleanField(required=False)
    price = ServicePriceInputSerializer(required=True)
