from rest_framework import serializers

from .models import GymPackage, Invoice, InvoiceItem, Payment, Subscription, SubscriptionPackage


class GymPackageSerializer(serializers.ModelSerializer):
    class Meta:
        model = GymPackage
        fields = [
            "id",
            "name",
            "description",
            "features",
            "plans",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]


class SubscriptionPackageSerializer(serializers.ModelSerializer):
    class Meta:
        model = SubscriptionPackage
        fields = [
            "id",
            "name",
            "price",
            "currency",
            "billing_cycle",
            "member_limit",
            "staff_accounts",
            "description",
            "features",
            "is_popular",
            "is_active",
            "sort_order",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]


class SubscriptionSerializer(serializers.ModelSerializer):
    user_email = serializers.EmailField(source="user.email", read_only=True)
    user_name = serializers.SerializerMethodField()

    class Meta:
        model = Subscription
        fields = [
            "id",
            "user",
            "user_email",
            "user_name",
            "package",
            "package_name",
            "amount",
            "currency",
            "billing_cycle",
            "payment_reference",
            "payment_method",
            "status",
            "paid_at",
            "expires_at",
            "created_at",
        ]
        read_only_fields = ["id", "user", "created_at"]

    def get_user_name(self, obj):
        return obj.user.get_full_name() or obj.user.username


class InvoiceItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = InvoiceItem
        fields = [
            "id",
            "invoice",
            "description",
            "quantity",
            "unit_price",
            "total_price",
            "item_type",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "invoice", "created_at", "updated_at"]


class InvoiceSerializer(serializers.ModelSerializer):
    items = InvoiceItemSerializer(many=True, read_only=True)
    member_name = serializers.SerializerMethodField()

    class Meta:
        model = Invoice
        fields = [
            "id",
            "member",
            "member_name",
            "invoice_number",
            "issue_date",
            "due_date",
            "subtotal",
            "tax_amount",
            "discount_amount",
            "total_amount",
            "status",
            "notes",
            "paid_at",
            "location",
            "items",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "invoice_number", "created_at", "updated_at"]

    def get_member_name(self, obj):
        return obj.member.user.get_full_name() or obj.member.user.email


class PaymentSerializer(serializers.ModelSerializer):
    member_name = serializers.SerializerMethodField()
    invoice_number = serializers.SerializerMethodField()

    class Meta:
        model = Payment
        fields = [
            "id",
            "invoice",
            "invoice_number",
            "member",
            "member_name",
            "amount",
            "currency",
            "payment_method",
            "gateway_transaction_id",
            "status",
            "processed_at",
            "location",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]

    def get_member_name(self, obj):
        return obj.member.user.get_full_name() or obj.member.user.email

    def get_invoice_number(self, obj):
        return obj.invoice.invoice_number if obj.invoice else None


class CreateSubscriptionSerializer(serializers.Serializer):
    package_id = serializers.UUIDField()
    amount = serializers.DecimalField(max_digits=10, decimal_places=2)
    billing_cycle = serializers.CharField(max_length=20)
    payment_reference = serializers.CharField(max_length=255)
    paid_at = serializers.DateTimeField()


class MpesaConfigSerializer(serializers.Serializer):
    consumer_key = serializers.CharField(max_length=255)
    consumer_secret = serializers.CharField(max_length=255)
    shortcode = serializers.CharField(max_length=20)
    passkey = serializers.CharField(max_length=255)


class STKPushRequestSerializer(serializers.Serializer):
    member_id = serializers.UUIDField()
    amount = serializers.IntegerField(min_value=1)
    phone_number = serializers.CharField(max_length=20)
    invoice_id = serializers.UUIDField(required=False, allow_null=True)
    package_id = serializers.UUIDField(required=False, allow_null=True)
    plan_duration = serializers.CharField(max_length=20, required=False, default="")
