import base64

from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers

from .models import *
from .services import *
from .selectors import *


class WireGuardVPNSerializer(serializers.ModelSerializer):
    address = serializers.CharField(read_only=True)
    vpn_server = serializers.CharField(read_only=True)
    vpn_server_public_key = serializers.CharField(read_only=True)
    network_mask = serializers.IntegerField()

    class Meta:
        model = WireGuardVPN
        fields = [ 'wireguard_public_key', 'address', 'network_mask', 'vpn_server',
                   'vpn_server_public_key' ]

        extra_kwargs = {
            'network_mask': {'write_only': True }
        }


    def validate_network_mask(self, value):
        msg = _(f"No pool for network size {value}")
        sizes = allowed_vpn_network_reservation_size()

        if not value in sizes:
            raise serializers.ValidationError(msg)

        return value

    def validate_wireguard_public_key(self, value):
        msg = _("Supplied key is not a valid wireguard public key")

        """
        Verify wireguard key.
        See https://lists.zx2c4.com/pipermail/wireguard/2020-December/006221.html
        """

        try:
            decoded_key = base64.standard_b64decode(value)
        except Exception as e:
            raise serializers.ValidationError(msg)

        if not len(decoded_key) == 32:
            raise serializers.ValidationError(msg)

        return value


class WireGuardVPNSizesSerializer(serializers.Serializer):
    size = serializers.IntegerField(min_value=0, max_value=128)
