#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from cmath import rect
import subprocess as sp
from app.utils import read_config

import json
import os
import re

class Device(object):

    def __init__(self, token):
        self.iface_in = read_config(("network", "in"))
        self.token = token if re.match(r"[A-F0-9]{8}", token) else None
        return None

    def get(self) -> dict:
        """Get the device properties (such as Mac address, name, IP etc.)
           By reading the device.json file if exists. Or reading the leases
           files and writing the result into device.json. 

        Returns:
            dict: device infos.
        """
        if not os.path.isfile("/tmp/{}/assets/device.json".format(self.token)):
            device = self.read_leases()
            if device["status"] != False:
                with open("/tmp/{}/assets/device.json".format(self.token), "w") as f:
                    f.write(json.dumps(device))
        else:
            with open("/tmp/{}/assets/device.json".format(self.token)) as f:
                device = json.load(f)
        return device

    def read_leases(self) -> dict:
        """Get the first connected device to the generated 
        networks by using ARP.

        Returns:
            dict: connected device.
        """

        sh = sp.Popen(["arp"], stdout=sp.PIPE, stderr=sp.PIPE)
        sh = sh.communicate()

        for line in sh[0].splitlines():
            line = line.decode("utf8")
            if self.iface_in in line:
                rec = [x for x in line.split(" ") if x]
                if rec[-1] == self.iface_in and rec[1] == "ether":
                    return {
                        "status": True,
                        "name": rec[2],
                        "ip_address": rec[0],
                        "mac_address": rec[2]
                    }
        else:
            return {"status": False,
                    "message": "Device not connected"}