import sys
sys.path.append('../../src/tui')

from lib import tuilib
import unittest

'''
specify chain ticker (daemon should be up), wif which will be imported and address to which you want to broadcast
added 1 second sleep after each case to surely not face the nSPV server limitation (1 call/second)
'''

wif = ''
dest_address = 'RMjy5VkHFJkXTJDTJ3XX1zVzukP48sKyva'
amount = '0.1'
chain = 'ILN'

rpc_proxy = tuilib.def_credentials(chain)


class TestNspvClient(unittest.TestCase):

    def test_nspv_getinfo(self):
        print("testing nspv_getinfo")
        result = rpc_proxy.nspv_getinfo()
        self.assertEqual(result["result"], "success")
        self.assertGreater(result["height"], 2689)
        time.sleep(1)

    def test_nspv_notarizations(self):
        print("testing nspv_notarizations")
        result = rpc_proxy.nspv_notarizations("2000")
        self.assertEqual(result["result"], "success")
        self.assertEqual(result["prev"]["notarized_height"], 1998)
        self.assertEqual(result["next"]["notarized_height"], 2002)
        time.sleep(1)

    def test_nspv_hdrsproof(self):
        print("testing nspv_hdrsproof")
        result = rpc_proxy.nspv_hdrsproof("2000", "2100")
        self.assertEqual(result["result"], "success")
        self.assertEqual(result["numhdrs"], 101)
        time.sleep(1)

    def test_nspv_login(self):
        print("testing nspv_login")
        result = rpc_proxy.nspv_login(wif)
        self.assertEqual(result["result"], "success")
        self.assertEqual(result["status"], "wif will expire in 777 seconds")
        time.sleep(1)

    def test_nspv_listunspent(self):
        print("testing nspv_listunspent")
        result = rpc_proxy.nspv_listunspent()
        self.assertEqual(result["result"], "success")
        time.sleep(1)
        result = rpc_proxy.nspv_listunspent("RQ1mvCUcziWzRwE8Ugtex29VjoFjRzxQJT")
        self.assertEqual(result["result"], "error")

    def test_nspv_spend(self):
        print("testing nspv_spend")
        result = rpc_proxy.nspv_login(wif)
        result = rpc_proxy.nspv_spend(dest_address, amount)
        self.assertEqual(result["result"], "success")
        self.assertEqual(result["vout"][0]["valueZat"], 10000000)
        time.sleep(1)

    def test_nspv_broadcast(self):
        print("testing nspv_broadcast")
        result = rpc_proxy.nspv_login(wif)
        broadcast_hex = rpc_proxy.nspv_spend(dest_address, amount)["hex"]
        time.sleep(1)
        result = rpc_proxy.nspv_broadcast(broadcast_hex)
        self.assertEqual(result["result"], "success")
        self.assertEqual(result["retcode"], 1)
        self.assertEqual(result["expected"], result["broadcast"])
        print("Broadcast txid: " + result["broadcast"])
        time.sleep(1)

    def test_nspv_logout(self):
        print("testing nspv_logout")
        rpc_proxy.nspv_login(wif)
        time.sleep(1)
        rpc_proxy.nspv_logout()
        time.sleep(1)
        result = rpc_proxy.nspv_spend(dest_address, amount)
        self.assertEqual(result["result"], "error")
        self.assertEqual(result["error"], "wif expired")
        time.sleep(1)

    def test_nspv_spentinfo(self):
        print("testing nspv_spent_info")
        result = rpc_proxy.nspv_spentinfo("67ffe0eaecd6081de04675c492a59090b573ee78955c4e8a85b8ac0be0e8e418", "1")
        self.assertEqual(result["result"], "success")
        self.assertEqual(result["spentheight"], 2681)
        time.sleep(1)

    def test_nspv_txproof(self):
        print("testing nspv_txproof")
        result = rpc_proxy.nspv_txproof("67ffe0eaecd6081de04675c492a59090b573ee78955c4e8a85b8ac0be0e8e418", "2673")
        self.assertEqual(result["txid"], "67ffe0eaecd6081de04675c492a59090b573ee78955c4e8a85b8ac0be0e8e418")
        time.sleep(1)

    def test_nspv_login_timout(self):
        print("testing auto-logout in 777 seconds")
        rpc_proxy.nspv_login(wif)
        time.sleep(777)
        result = rpc_proxy.nspv_spend(dest_address, amount)
        self.assertEqual(result["result"], "error")
        self.assertEqual(result["error"], "wif expired")
        time.sleep(1)


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