from decouple import config
from django.conf import settings
from django.contrib.auth.models import User
from django.test import Client
from django.urls import reverse

from tests.test_api import BaseAPITestCase

FEE = config("FEE", cast=float, default=0.2)
NODE_ID = config("NODE_ID", cast=str, default="033b58d7......")
MAKER_FEE = FEE * config("FEE_SPLIT", cast=float, default=0.125)
TAKER_FEE = FEE * (1 - config("FEE_SPLIT", cast=float, default=0.125))
BOND_SIZE = config("BOND_SIZE", cast=float, default=3)
NOTICE_SEVERITY = config("NOTICE_SEVERITY", cast=str, default="none")
NOTICE_MESSAGE = config("NOTICE_MESSAGE", cast=str, default="")


class APIInfoTest(BaseAPITestCase):
    su_pass = "12345678"
    su_name = config("ESCROW_USERNAME", cast=str, default="admin")

    def setUp(self):
        """
        Create a superuser. The superuser is the escrow party.
        """
        self.client = Client()
        User.objects.create_superuser(self.su_name, "super@user.com", self.su_pass)

    def test_info(self):
        path = reverse("info")

        response = self.client.get(path)
        data = response.json()

        self.assertEqual(response.status_code, 200)
        self.assertResponse(response)

        self.assertEqual(data["num_public_buy_orders"], 0)
        self.assertEqual(data["num_public_sell_orders"], 0)
        self.assertEqual(data["book_liquidity"], 0)
        self.assertEqual(data["active_robots_today"], 0)
        self.assertEqual(data["last_day_nonkyc_btc_premium"], 0)
        self.assertEqual(data["last_day_volume"], 0)
        self.assertEqual(data["lifetime_volume"], 0)
        self.assertTrue(isinstance(data["lnd_version"], str))
        self.assertTrue(isinstance(data["cln_version"], str))
        self.assertEqual(
            data["robosats_running_commit_hash"], "00000000000000000000 dev"
        )
        self.assertEqual(data["version"], settings.VERSION)
        self.assertEqual(data["node_id"], NODE_ID)
        self.assertEqual(
            data["network"], "testnet"
        )  # tests take place in regtest, but this attribute is read from .env
        self.assertAlmostEqual(data["maker_fee"], MAKER_FEE)
        self.assertAlmostEqual(data["taker_fee"], TAKER_FEE)
        self.assertAlmostEqual(data["bond_size"], BOND_SIZE)
        self.assertEqual(data["notice_severity"], NOTICE_SEVERITY)
        self.assertEqual(data["notice_message"], NOTICE_MESSAGE)
        self.assertEqual(data["current_swap_fee_rate"], 0)