# vouchers/serializers.py

from rest_framework import serializers
from .models import Brand, VoucherPurchaseHistory

class BrandSerializer(serializers.ModelSerializer):
    class Meta:
        model = Brand
        fields = '__all__'

class VoucherPurchaseSerializer(serializers.ModelSerializer):
    brand = serializers.StringRelatedField()

    class Meta:
        model = VoucherPurchaseHistory
        fields = ['order_id', 'brand', 'denomination', 'quantity', 'created_at', 'response']

from rest_framework import serializers
from .models import Voucher
from datetime import datetime

class VoucherSerializer(serializers.ModelSerializer):
    brand = serializers.StringRelatedField()
    amount = serializers.IntegerField(source='value')
    code = serializers.CharField(source='voucher_code')
    # normalize the string date into ISO (YYYY-MM-DD); fallback to raw string if parsing fails
    expiry_date = serializers.SerializerMethodField()

    class Meta:
        model = Voucher
        # fields = "__all__"
        exclude = ['voucher_code', 'value']  # hide raw fields, keep the rest

    # --- helpers ---
    _DATE_FORMATS = (
        "%Y-%m-%d",      # 2025-08-22
        "%d-%m-%Y",      # 22-08-2025
        "%d/%m/%Y",      # 22/08/2025
        "%Y/%m/%d",      # 2025/08/22
        "%d %b %Y",      # 22 Aug 2025
        "%d %B %Y",      # 22 August 2025
        "%m/%d/%Y",      # 08/22/2025
        "%m-%d-%Y",      # 08-22-2025
    )

    @classmethod
    def _parse_date(cls, s: str):
        if not s:
            return None
        s = s.strip()
        for fmt in cls._DATE_FORMATS:
            try:
                return datetime.strptime(s, fmt).date()
            except ValueError:
                continue
        return None

    def get_expiry_date(self, obj) -> str:
        parsed = self._parse_date(obj.expiry_date)
        # Return ISO 'YYYY-MM-DD' if parsed; else return the original string
        return parsed.isoformat() if parsed else (obj.expiry_date or "")
