from rest_framework import serializers
from .models import MarketTick, Order


class ListOrderSerializer(serializers.ModelSerializer):

    class Meta:
        model = Order
        fields = (
            "id",
            "status",
            "created_at",
            "expires_at",
            "type",
            "currency",
            "amount",
            "has_range",
            "min_amount",
            "max_amount",
            "payment_method",
            "is_explicit",
            "premium",
            "satoshis",
            "bondless_taker",
            "maker",
            "taker",
            "escrow_duration",
        )


class MakeOrderSerializer(serializers.ModelSerializer):

    class Meta:
        model = Order
        fields = (
            "type",
            "currency",
            "amount",
            "has_range",
            "min_amount",
            "max_amount",
            "payment_method",
            "is_explicit",
            "premium",
            "satoshis",
            "public_duration",
            "escrow_duration",
            "bond_size",
            "bondless_taker",
        )

class UpdateOrderSerializer(serializers.Serializer):
    invoice = serializers.CharField(max_length=2000,
                                    allow_null=True,
                                    allow_blank=True,
                                    default=None)
    address = serializers.CharField(max_length=100,
                                    allow_null=True,
                                    allow_blank=True,
                                    default=None)
    statement = serializers.CharField(max_length=10000,
                                      allow_null=True,
                                      allow_blank=True,
                                      default=None)
    action = serializers.ChoiceField(
        choices=(
            "pause",
            "take",
            "update_invoice",
            "update_address",
            "submit_statement",
            "dispute",
            "cancel",
            "confirm",
            "rate_user",
            "rate_platform",
        ),
        allow_null=False,
    )
    rating = serializers.ChoiceField(
        choices=("1", "2", "3", "4", "5"),
        allow_null=True,
        allow_blank=True,
        default=None,
    )
    amount = serializers.DecimalField(max_digits=18, decimal_places=8, allow_null=True, required=False, default=None)
    mining_fee_rate = serializers.DecimalField(max_digits=6, decimal_places=3, allow_null=True, required=False, default=None)

class UserGenSerializer(serializers.Serializer):
    # Mandatory fields
    token_sha256 = serializers.CharField(
                                    min_length=64,
                                    max_length=64,
                                    allow_null=False,
                                    allow_blank=False,
                                    required=True,
                                    help_text="SHA256 of user secret")
    public_key = serializers.CharField(max_length=2000,
                                      allow_null=False,
                                      allow_blank=False,
                                      required=True,
                                      help_text="Armored ASCII PGP public key block")
    encrypted_private_key = serializers.CharField(max_length=2000,
                                      allow_null=False,
                                      allow_blank=False,
                                      required=True,
                                      help_text="Armored ASCII PGP encrypted private key block")

    # Optional fields
    ref_code = serializers.CharField(max_length=30,
                                      allow_null=True,
                                      allow_blank=True,
                                      required=False,
                                      default=None)
    counts = serializers.ListField(child=serializers.IntegerField(),
                                      allow_null=True,
                                      required=False,
                                      default=None)
    length = serializers.IntegerField(allow_null=True,
                                      default=None,
                                      required=False,
                                      min_value=1)
    unique_values = serializers.IntegerField(allow_null=True,
                                      default=None,
                                      required=False,
                                      min_value=1)

class ClaimRewardSerializer(serializers.Serializer):
    invoice = serializers.CharField(max_length=2000,
                                    allow_null=True,
                                    allow_blank=True,
                                    default=None)

class PriceSerializer(serializers.Serializer):
    pass

class TickSerializer(serializers.ModelSerializer):

    class Meta:
        model = MarketTick
        fields = (
            "timestamp",
            "currency",
            "volume",
            "price",
            "premium",
            "fee",
        )
        depth = 1