"""Test case for Netbox Device Creation"""

import unittest
import os
import requests
import json

HOST = os.getenv("HOST", default="localhost")
PORT = os.getenv("PORT", default="8080")
API_TOKEN = os.getenv("API_TOKEN")

class TestNetboxDeviceCreate(unittest.TestCase):
    """Test case for device creation"""

    @classmethod
    def setUpClass(cls) -> None:
        """Will create a manufacturer, site, device role and device type"""
        response = requests.post(
            url=f"http://{HOST}:{PORT}/api/dcim/manufacturers/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            json={
                "name": "Cisco",
                "slug": "cisco"
            },
            timeout=5
        )

        """Will create a device role """

        response = requests.post(
            url=f"http://{HOST}:{PORT}/api/dcim/device-roles/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            json={
                "name": "Switch",
                "slug":"switch"
            },
            timeout=5
        )

        """ Will create a device type """
        manufacturer_id = requests.get(url=f"http://{HOST}:{PORT}/api/dcim/manufacturers/", headers={"Authorization": f"Token {API_TOKEN}"})
        id = json.loads(manufacturer_id.content)["results"][0]["id"]
        response = response = requests.post(
            url=f"http://{HOST}:{PORT}/api/dcim/device-types/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            json={
                "model": "WS-C2960X",
                "slug":"ws-c2960x",
                "manufacturer": id
            },
            timeout=5
        )

        """ will create a site"""
        response = requests.post(
            url=f"http://{HOST}:{PORT}/api/dcim/sites/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            json={
                "name": "ISPRA",
                "slug":"ispra"
            },
            timeout=5
        )


    @classmethod
    def tearDownClass(cls) -> None:
        """ Deleting all data from NETBOX once the all the tests finish running """

        #deleting the device

        device_id = requests.get(url=f"http://{HOST}:{PORT}/api/dcim/devices/", headers={"Authorization": f"Token {API_TOKEN}"})
        id = json.loads(device_id.content)["results"][0]["id"]
        response_device = requests.delete(
            url= f"http://{HOST}:{PORT}/api/dcim/devices/{id}/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            timeout=5
        )

        #deleting the device type

        device_type_id = requests.get(url=f"http://{HOST}:{PORT}/api/dcim/device-types/", headers={"Authorization": f"Token {API_TOKEN}"})
        id = json.loads(device_type_id.content)["results"][0]["id"]
        response_device_type = requests.delete(
            url= f"http://{HOST}:{PORT}/api/dcim/device-types/{id}/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            timeout=5
        )

        #deleting the manufacturer
        manufacturer_id = requests.get(url=f"http://{HOST}:{PORT}/api/dcim/manufacturers/", headers={"Authorization": f"Token {API_TOKEN}"})
        #id = json.loads(manufacturer_id.content)["id"]
        #print(json.loads(manufacturer_id.content)["results"][0]["id"])
        id = json.loads(manufacturer_id.content)["results"][0]["id"]
        #print(type(json.loads(manufacturer_id.content)["results"][0]["id"]))
        respose_manufacturer = requests.delete(
            url= f"http://{HOST}:{PORT}/api/dcim/manufacturers/{id}/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            timeout=5
        )

        # deleting the device role
        device_role_id = requests.get(url=f"http://{HOST}:{PORT}/api/dcim/device-roles/", headers={"Authorization": f"Token {API_TOKEN}"})
        id = json.loads(device_role_id.content)["results"][0]["id"]
        response_device_role = requests.delete(
            url= f"http://{HOST}:{PORT}/api/dcim/device-roles/{id}/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            timeout=5
        )

        # deleting the site

        site_id =  requests.get(url=f"http://{HOST}:{PORT}/api/dcim/sites/", headers={"Authorization": f"Token {API_TOKEN}"})
        id = json.loads(site_id.content)["results"][0]["id"]
        response_site = requests.delete(
            url= f"http://{HOST}:{PORT}/api/dcim/sites/{id}/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            timeout=5
        )

    def tearDown(self) -> None:
        pass
    
    def test_device_creation(self) -> None:
        """" getting the necessary IDs """
        device_type = requests.get(url=f"http://{HOST}:{PORT}/api/dcim/device-types/", headers={"Authorization": f"Token {API_TOKEN}"})
        device_type_id = json.loads(device_type.content)["results"][0]["id"]

        device_role = requests.get(url=f"http://{HOST}:{PORT}/api/dcim/device-roles/", headers={"Authorization": f"Token {API_TOKEN}"})
        device_role_id = json.loads(device_role.content)["results"][0]["id"]

        site =  requests.get(url=f"http://{HOST}:{PORT}/api/dcim/sites/", headers={"Authorization": f"Token {API_TOKEN}"})
        site_id = json.loads(site.content)["results"][0]["id"]

        # Creating the device

        response = response = requests.post(
            url=f"http://{HOST}:{PORT}/api/dcim/devices/",
            headers={"Authorization": f"Token {API_TOKEN}"},
            json={
                "name": "test",
                "device_type": device_type_id,
                "role": device_role_id,
                "site": site_id,
                "status": "offline"
            },
            timeout=5
        )

        self.assertEqual(response.status_code,201)
        self.assertEqual(json.loads(response.content)["name"],"test")
        self.assertEqual(json.loads(response.content)["device_type"]["display"],"WS-C2960X")
        self.assertEqual(json.loads(response.content)["role"]["name"],"Switch")
        self.assertEqual(json.loads(response.content)["site"]["name"],"ISPRA")
        self.assertEqual(json.loads(response.content)["status"]["value"],"offline")

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