import io

from rest_framework import serializers
from django.contrib.auth import get_user_model
from django.conf import settings
from paramiko.rsakey import RSAKey


User = get_user_model()


class UserSerializer(serializers.ModelSerializer):
    """
    用户序列化类
    """
    username    = serializers.CharField(required=False, read_only=False, max_length=32, label="用户名", help_text="用户名")
    name        = serializers.CharField(required=False, read_only=False, label="姓名", help_text="姓名")
    is_active   = serializers.BooleanField(required=False, label="登陆状态", help_text="登陆状态")
    email       = serializers.CharField(read_only=True, help_text="联系邮箱")
    last_login  = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True, help_text="上次登录时间")
    phone       = serializers.CharField(required=False, max_length=11, min_length=11, allow_null=True, help_text="手机号",
                                        error_messages={"max_length":"手机号错误","min_length":"手机号错误"},
                                        )

    class Meta:
        model = User
        fields = ("id", "username", "name", "phone", "email", "is_active", "last_login")


class UserRegSerializer(serializers.ModelSerializer):
    """
    用户注册序列化类
    """
    id       = serializers.IntegerField(read_only=True)
    name     = serializers.CharField(max_length=32, label="姓名", help_text="用户姓名,中文姓名")
    username = serializers.CharField(max_length=32, label="用户名", help_text="用户名,用户登陆名")
    password = serializers.CharField(style={"input_type": "password"}, label="密码", write_only=True, help_text="密码")
    phone    = serializers.CharField(max_length=11, min_length=11, label="手机号", required=False,
                                     allow_null=True, allow_blank=True, help_text="手机号")

    def create(self, validated_data):
        validated_data["is_active"] = False
        instance = super(UserRegSerializer, self).create(validated_data=validated_data)
        instance.email = "{}{}".format(instance.username, settings.DOMAIN)

        instance.set_password(validated_data["password"])
        instance.id_rsa_key, instance.id_rsa_pub = self.get_sshkey(instance.email)
        instance.save()
        return instance

    def update(self, instance, validated_data):
        password =  validated_data.get("password", None)
        if password:
            instance.set_password(password)
            instance.save()
        return instance

    def get_sshkey(self, email):
        output = io.StringIO()
        sbuffer = io.StringIO()

        key = RSAKey.generate(2048)
        key.write_private_key(output)
        private_key = output.getvalue()

        sbuffer.write("{} {} {}".format(key.get_name(), key.get_base64(), email))
        public_key = sbuffer.getvalue()
        return private_key, public_key

    class Meta:
        model = User
        fields = ("username", "password", "name", "id", "phone")