from common import *  # isort:skip

from trezor.crypto import hashlib

if not utils.BITCOIN_ONLY:
    from trezor.messages import NEMProvisionNamespace, NEMSignTx, NEMTransactionCommon

    from apps.nem.helpers import *
    from apps.nem.namespace import *
    from apps.nem.namespace.serialize import *


@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestNemNamespace(unittest.TestCase):
    def test_create_provision_namespace(self):

        # http://bob.nem.ninja:8765/#/transfer/0acbf8df91e6a65dc56c56c43d65f31ff2a6a48d06fc66e78c7f3436faf3e74f
        m = _create_msg(
            NEM_NETWORK_TESTNET,
            56999445,
            20000000,
            57003045,
            "gimre",
            "",
            "TAMESPACEWH4MKFMBCVFERDPOOP4FK7MTDJEYP35",
            5000000000,
        )
        t = serialize_provision_namespace(
            m.transaction,
            m.provision_namespace,
            unhexlify(
                "84afa1bbc993b7f5536344914dde86141e61f8cbecaf8c9cefc07391f3287cf5"
            ),
        )
        self.assertEqual(
            hashlib.sha3_256(t, keccak=True).digest(),
            unhexlify(
                "f7cab28da57204d01a907c697836577a4ae755e6c9bac60dcc318494a22debb3"
            ),
        )

        # http://bob.nem.ninja:8765/#/namespace/7ddd5fe607e1bfb5606e0ac576024c318c8300d237273117d4db32a60c49524d
        m = _create_msg(
            NEM_NETWORK_TESTNET,
            21496797,
            108000000,
            21500397,
            "misc",
            "alice",
            "TAMESPACEWH4MKFMBCVFERDPOOP4FK7MTDJEYP35",
            5000000000,
        )
        t = serialize_provision_namespace(
            m.transaction,
            m.provision_namespace,
            unhexlify(
                "244fa194e2509ac0d2fbc18779c2618d8c2ebb61c16a3bcbebcf448c661ba8dc"
            ),
        )

        self.assertEqual(
            hashlib.sha3_256(t, keccak=True).digest(),
            unhexlify(
                "7ddd5fe607e1bfb5606e0ac576024c318c8300d237273117d4db32a60c49524d"
            ),
        )

        # http://chain.nem.ninja/#/namespace/57071aad93ca125dc231dc02c07ad8610cd243d35068f9b36a7d231383907569
        m = _create_msg(
            NEM_NETWORK_MAINNET,
            26699717,
            108000000,
            26703317,
            "sex",
            "",
            "NAMESPACEWH4MKFMBCVFERDPOOP4FK7MTBXDPZZA",
            50000000000,
        )
        t = serialize_provision_namespace(
            m.transaction,
            m.provision_namespace,
            unhexlify(
                "9f3c14f304309c8b72b2821339c4428793b1518bea72d58dd01f19d523518614"
            ),
        )

        self.assertEqual(
            hashlib.sha3_256(t, keccak=True).digest(),
            unhexlify(
                "57071aad93ca125dc231dc02c07ad8610cd243d35068f9b36a7d231383907569"
            ),
        )


def _create_msg(
    network: int,
    timestamp: int,
    fee: int,
    deadline: int,
    name: str,
    parent: str,
    sink: str,
    rental_fee: int,
):
    transaction = NEMTransactionCommon(
        network=network,
        timestamp=timestamp,
        fee=fee,
        deadline=deadline,
    )

    provision_namespace = NEMProvisionNamespace(
        namespace=name,
        parent=parent,
        sink=sink,
        fee=rental_fee,
    )

    return NEMSignTx(
        transaction=transaction,
        provision_namespace=provision_namespace,
    )


if __name__ == "__main__":
    unittest.main()