import uuid
from django.db import models
from django.contrib.auth import get_user_model
from uncloud_pay.models import Product

# ungleich specific
storage_class_mapping = {
    'one': 'ssd',
    'ssd': 'ssd',
    'hdd': 'hdd'
}

class VM(Product):
    vmid = models.IntegerField(primary_key=True)
    data = models.JSONField()

    @property
    def uncloud_name(self):
        return "opennebula-{}".format(self.vmid)

    @property
    def cores(self):
        return int(self.data['TEMPLATE']['VCPU'])

    @property
    def ram_in_gb(self):
        return int(self.data['TEMPLATE']['MEMORY'])/1024

    @property
    def disks(self):
        """
        If there is no disk then the key DISK does not exist.

        If there is only one disk, we have a dictionary in the database.

        If there are multiple disks, we have a list of dictionaries in the database.
        """

        disks = []

        if 'DISK' in self.data['TEMPLATE']:
            if type(self.data['TEMPLATE']['DISK']) is dict:
                disks = [self.data['TEMPLATE']['DISK']]
            else:
                disks = self.data['TEMPLATE']['DISK']

        disks = [
            {
                'size_in_gb': int(d['SIZE'])/1024,
                'opennebula_source': d['SOURCE'],
                'opennebula_name': d['IMAGE'],
                'image_size_in_gb': int(d['ORIGINAL_SIZE'])/1024,
                'pool_name': d['POOL_NAME'],
                'image': d['IMAGE'],
                'source': d['SOURCE'],
                'source_type': d['TM_MAD'],
                'storage_class': storage_class_mapping[d['POOL_NAME']]

            }
            for d in disks
        ]

        return disks

    @property
    def last_host(self):
        return ((self.data.get('HISTORY_RECORDS', {}) or {}).get('HISTORY', {}) or {}).get('HOSTNAME', None)

    @property
    def graphics(self):
        return self.data.get('TEMPLATE', {}).get('GRAPHICS', {})

    @property
    def nics(self):
        _nics = self.data.get('TEMPLATE', {}).get('NIC', {})
        if isinstance(_nics, dict):
            _nics = [_nics]
        return _nics

    @property
    def ips(self):
        ipv4, ipv6 = [], []
        for nic in self.nics:
            ip = nic.get('IP')
            ip6 = nic.get('IP6_GLOBAL')
            if ip:
                ipv4.append(ip)
            if ip6:
                ipv6.append(ip6)
        return ipv4, ipv6