"""Subscription API serializers."""

from __future__ import annotations

from django.utils import timezone
from rest_framework import serializers

from simorgh.apps.subscription.models import (
    PlanFeature,
    PlatformPlan,
    TenantAddonFeature,
    TenantSubscription,
)


class PlanEntitlementSerializer(serializers.ModelSerializer):
    class Meta:
        model = PlanFeature
        fields = ("feature_key", "enabled_by_default", "config_json")


class PlanSerializer(serializers.ModelSerializer):
    entitlements = PlanEntitlementSerializer(many=True, read_only=True, source="plan_features")

    class Meta:
        model = PlatformPlan
        fields = (
            "id",
            "code",
            "name",
            "description",
            "price_monthly",
            "price_yearly",
            "currency",
            "user_limit",
            "storage_gb",
            "workflow_limit",
            "api_calls_per_month",
            "trial_days",
            "sort_order",
            "entitlements",
        )


class TenantSubscriptionSerializer(serializers.ModelSerializer):
    plan = PlanSerializer(read_only=True)
    plan_code = serializers.CharField(source="plan.code", read_only=True)

    class Meta:
        model = TenantSubscription
        fields = (
            "id",
            "plan",
            "plan_code",
            "status",
            "trial_ends_at",
            "current_period_start",
            "current_period_end",
            "seat_count",
            "cancelled_at",
            "cancellation_reason",
        )


class TenantAddonFeatureSerializer(serializers.ModelSerializer):
    is_active = serializers.SerializerMethodField()

    class Meta:
        model = TenantAddonFeature
        fields = (
            "id",
            "feature_key",
            "purchased_at",
            "expires_at",
            "price_paid",
            "is_active",
        )

    def get_is_active(self, obj: TenantAddonFeature) -> bool:
        return obj.expires_at is None or obj.expires_at > timezone.now()


# ---------------------------------------------------------------------------
# Request bodies
# ---------------------------------------------------------------------------


class StartTrialSerializer(serializers.Serializer):
    plan_code = serializers.CharField(max_length=40, default="free")


class ChangePlanSerializer(serializers.Serializer):
    plan_code = serializers.CharField(max_length=40)
    billing_cycle = serializers.ChoiceField(
        choices=["monthly", "yearly"], default="monthly"
    )


class CancelSubscriptionSerializer(serializers.Serializer):
    reason = serializers.CharField(max_length=1000, required=False, default="")


class PurchaseAddonSerializer(serializers.Serializer):
    feature_key = serializers.CharField(max_length=120)
    expires_at = serializers.DateTimeField(required=False, allow_null=True)
    price_paid = serializers.DecimalField(
        max_digits=12, decimal_places=2, required=False, default=0
    )
