import datetime
from datetime import timedelta
from django.db import transaction
from django.utils import timezone
from rest_framework import serializers
from api.models import *


# Create your serializers here.

class DeviceGetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Device
        fields = '__all__'


class DeviceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Device
        fields = ['pk', 'deviceToken', 'deviceType']

    def create(self, validated_data):
        # validated_data["deviceType"] = self.context["request"].headers.get("devicetype")
        device, created = Device.objects.get_or_create(**validated_data)
        if created:
            plan = Plan.objects.filter(type=PlanType.FREE_ACCESS).first()
            if plan:
                current_time = timezone.now()
                Transaction.objects.create(device=device,
                                           plan=plan,
                                           purchaseToken="free_token",
                                           productId="free_product",
                                           orderId="free_order",
                                           originalTransactionId="free_original",
                                           appleTransactionId="free_apple",
                                           amount=0,
                                           startAt=current_time,
                                           expireAt=None)
        return device
        # instance = super().create(validated_data)
        # plan = Plan.objects.filter(name="free").first()
        # expires_at = timezone.now() + timedelta(days=365)
        # Subscription.objects.create(device=instance,
        #                             plan=plan,
        #                             subscribed_at=timezone.now(),
        #                             expires_at=expires_at,
        #                             is_active=True,
        #                             purchase_token="token",
        #                             platform="android")
        # return instance


class CategorySerializer(serializers.ModelSerializer):
    isUnlocked = serializers.BooleanField(read_only=True)

    class Meta:
        model = Category
        fields = '__all__'


class CraptitudeSerializer(serializers.ModelSerializer):
    isUnlocked = serializers.BooleanField(read_only=True)

    class Meta:
        model = Craptitude
        fields = '__all__'


class TeamSerializer(serializers.ModelSerializer):
    class Meta:
        model = Team
        fields = '__all__'


class GameSessionSerializer(serializers.ModelSerializer):
    class Meta:
        model = GameSession
        fields = '__all__'

    def create(self, validated_data):
        instance, obj = GameSession.objects.get_or_create(**validated_data)
        return instance


class PlayerCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Player
        fields = ['pk', 'session', 'team', 'name']
        read_only_fields = ['session']


class SentenceCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Sentence
        fields = ['pk', 'session', 'team', 'player', 'text']
        read_only_fields = ['session']


class SentenceGetSerializer(serializers.ModelSerializer):
    name = serializers.CharField(read_only=True, source='team.name')

    class Meta:
        model = Sentence
        fields = ['pk', 'team', 'name', 'text']


class RatingCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Rating
        fields = ['pk', 'session', 'sentence', 'diaperScore', 'dumpsterScore']
        read_only_fields = ['session']


class RatingGetSerializer(serializers.ModelSerializer):
    sentence = SentenceGetSerializer(many=True, read_only=True)

    class Meta:
        model = Rating
        fields = ['pk', 'session', 'sentence', 'diaperScore', 'dumpsterScore']


class OptionsSerializer(serializers.Serializer):
    option = serializers.ChoiceField(choices=OptionChoice.choices, required=False)


class PlanSerializer(serializers.ModelSerializer):
    isActive = serializers.BooleanField(read_only=True)

    class Meta:
        model = Plan
        fields = '__all__'


class AndroidPurchaseSerializer(serializers.ModelSerializer):
    type = serializers.CharField()

    class Meta:
        model = AndroidTransaction
        fields = ['id', 'device', 'productId', 'orderId', 'purchaseToken', 'type']


class ApplePurchaseSerializer(serializers.ModelSerializer):
    class Meta:
        model = AppleTransaction
        fields = ['id', 'device', 'productId', 'appleTransactionId', 'originalTransactionId', 'appleReceipt']


class AndroidPlanRestoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = AndroidTransaction
        fields = ['id', 'device', 'purchaseToken', 'productId']


class ApplePlanRestoreSerializer(serializers.ModelSerializer):
    isNewUser = serializers.BooleanField(read_only=False)

    class Meta:
        model = AppleTransaction
        fields = ['id', 'device', 'productId', 'appleTransactionId', 'originalTransactionId', 'appleReceipt',
                  'isNewUser']


class TransactionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Transaction
        fields = '__all__'
