import unittest

from aws_lambda_tools.common import openapi_json_serde

from conio_sdk_generated.openapi.v2.serde.models.acceptance import Acceptance
from conio_sdk_generated.openapi.v2.serde.models.acceptance_choice_type import AcceptanceChoiceType
from conio_sdk_generated.openapi.v2.serde.models.acceptance_type import AcceptanceType
from conio_sdk_generated.openapi.v2.serde.models.conio_credentials import ConioCredentials
from conio_sdk_generated.openapi.v2.serde.models.encrypted_user_key import EncryptedUserKey
from conio_sdk_generated.openapi.v2.serde.models.full_signup import FullSignup
from conio_sdk_generated.openapi.v2.serde.models.signup_crypto_request import SignupCryptoRequest
from conio_sdk_generated.openapi.v2.serde.models.terms_and_conditions_acceptances import TermsAndConditionsAcceptances


class TestSignup(unittest.TestCase):
    def test(self):
        s = FullSignup(
            conio_credentials=ConioCredentials(
                user_id='anExternalUserId',
                password='aHashedConioPassword'
            ),
            tc=TermsAndConditionsAcceptances([
                Acceptance(
                    acceptance_type=AcceptanceType.CLIENT_SUPPORT,
                    acceptance_choice=AcceptanceChoiceType.ACCEPTED
                ),
                Acceptance(
                    acceptance_type=AcceptanceType.APP_IMPROVEMENT,
                    acceptance_choice=AcceptanceChoiceType.REJECTED
                )
            ]),
            crypto_request=SignupCryptoRequest(
                proof_id='a proof_id',
                crypto_proof=b'a crypto proof',
                proof_expiration=12345,
                external_user_id='an external user id',
                user_level='a user level',
                iban='an iban',
                email='anemail@conio.com',
                first_name='John',
                last_name='Burns'
            ),
            encrypted_user_key=EncryptedUserKey(
                encrypted_mnemonic=b'an encrypted mnemonic',
                encrypted_seed=b'an encrypted seed',
                encrypted_private_key=b'an encrypted private key',
                bip32_public_key='a bip32 public key'
            )
        )

        serialized = openapi_json_serde.serialize(s)
        deserialized: FullSignup = openapi_json_serde.deserialize(serialized, FullSignup)
        self.assertEqual(s.to_str(), deserialized.to_str())
        self.assertEqual('anExternalUserId', deserialized.conio_credentials.user_id)
        self.assertEqual('aHashedConioPassword', deserialized.conio_credentials.password)
        self.assertEqual('client_support', deserialized.tc.acceptances[0].acceptance_type)
        self.assertEqual('accepted', deserialized.tc.acceptances[0].acceptance_choice)
        self.assertEqual('app_improvement', deserialized.tc.acceptances[1].acceptance_type)
        self.assertEqual('rejected', deserialized.tc.acceptances[1].acceptance_choice)
        self.assertEqual('a proof_id', deserialized.crypto_request.proof_id)
        self.assertEqual(b'a crypto proof', deserialized.crypto_request.crypto_proof)
        self.assertEqual(12345, deserialized.crypto_request.proof_expiration)
        self.assertEqual('an external user id', deserialized.crypto_request.external_user_id)
        self.assertEqual('a user level', deserialized.crypto_request.user_level)
        self.assertEqual('an iban', deserialized.crypto_request.iban)
        self.assertEqual('anemail@conio.com', deserialized.crypto_request.email)
        self.assertEqual('John', deserialized.crypto_request.first_name)
        self.assertEqual('Burns', deserialized.crypto_request.last_name)
        self.assertEqual(b'an encrypted mnemonic', deserialized.encrypted_user_key.encrypted_mnemonic)
        self.assertEqual(b'an encrypted seed', deserialized.encrypted_user_key.encrypted_seed)
        self.assertEqual(b'an encrypted private key', deserialized.encrypted_user_key.encrypted_private_key)
        self.assertEqual('a bip32 public key', deserialized.encrypted_user_key.bip32_public_key)
