import json
from abc import ABC

from django.utils.timezone import localtime
from rest_framework import serializers as sr

from tombola.models import HourRange, User


class FunctionSerializer(sr.Serializer):
    id = sr.IntegerField()
    name = sr.CharField(max_length=128)

    def __json__(self):
        return json.dumps(self.data)


class UserSerializer(sr.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'first_name', 'last_name', 'is_badge', 'is_partner', 'is_coord']


    def __json__(self):
        return json.dumps(self.data)


class RaffleDrawSerializer(sr.Serializer):
    id = sr.IntegerField()
    creation_date = sr.DateField()
    name = sr.CharField(max_length=1024)
    participants = sr.IntegerField()
    winners_t1 = sr.IntegerField()
    winners_t2 = sr.IntegerField()
    winners_p = sr.IntegerField()
    winners_24h = sr.IntegerField()
    start_datetime = sr.DateTimeField()
    end_datetime = sr.DateTimeField()
    partners_number = sr.IntegerField()
    timestamp_raffle = sr.IntegerField()
    is_active = sr.BooleanField()
    state = sr.IntegerField()
    step_raffle = sr.IntegerField()

    def __json__(self):
        return json.dumps(self.data)


class PartenaireSerializer(sr.Serializer):
    id = sr.IntegerField()
    raffle = RaffleDrawSerializer()
    user = UserSerializer()

    def __json__(self):
        return json.dumps(self.data)


class HourRangeSerializer(sr.ModelSerializer):
    raffle = RaffleDrawSerializer()
    start_hour = sr.SerializerMethodField('get_start_hour')
    end_hour = sr.SerializerMethodField('get_end_hour')

    def get_start_hour(self, instance):
        return localtime(instance.start).strftime('%H:%M')

    def get_end_hour(self, instance):
        return localtime(instance.end).strftime('%H:%M')

    class Meta:
        model = HourRange
        fields = ['id', 'raffle', 'start', 'end', 'start_hour', 'end_hour']

    def __json__(self):
        return json.dumps(self.data)


class PasseportSerializer(sr.Serializer):
    id = sr.IntegerField()
    raffle = RaffleDrawSerializer()
    number = sr.IntegerField()
    firstname = sr.CharField(max_length=256)
    lastname = sr.CharField(max_length=256)
    unique_id = sr.CharField(max_length=256)
    win_t1 = sr.IntegerField()
    win_t2 = sr.IntegerField()
    win_p = sr.IntegerField()
    win_24h = sr.IntegerField()


    def __json__(self):
        return json.dumps(self.data)


class TicketSerializer(sr.Serializer):
    id = sr.IntegerField()
    passeport = PasseportSerializer()
    hour_range = HourRangeSerializer()
    partner = PartenaireSerializer()


    def __json__(self):
        return json.dumps(self.data)



