from django.shortcuts import render
from django.http import HttpResponse, Http404
from accounts.models import UserInstance, UserSSHKey
from instances.models import Instance
from vrtManager.instance import wvmInstance
from libvirt import libvirtError
import json
import socket

OS_VERSIONS = ['latest', '']
OS_UUID = "iid-dswebvirtcloud"


def os_index(request):
    response = '\n'.join(OS_VERSIONS)
    return HttpResponse(response)


def os_metadata_json(request, version):
    """
    :param request:
    :param version:
    :return:
    """

    if version == 'latest':
        ip = get_client_ip(request)
        hostname = get_hostname_by_ip(ip)
        response = { 'uuid': OS_UUID, 'hostname': hostname }
        return HttpResponse(json.dumps(response))
    else:
        err = 'Invalid version: {}'.format(version)
        raise Http404(err)


def os_userdata(request, version):
    """
    :param request:
    :param version:
    :return:
    """
    if version == 'latest':
        ip = get_client_ip(request)
        hostname = get_hostname_by_ip(ip)
        vname = hostname.split('.')[0]
        
        instance_keys = []
        userinstances = UserInstance.objects.filter(instance__name=vname)
        
        for ui in userinstances:
            keys = UserSSHKey.objects.filter(user=ui.user)
            for k in keys:
                instance_keys.append(k.keypublic)

        return render(request, 'user_data', locals())
    else:
        err = 'Invalid version: {}'.format(version)
        raise Http404(err)


def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[-1].strip()
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip


def get_hostname_by_ip(ip):
    try:
        addrs = socket.gethostbyaddr(ip)
    except Exception:
        addrs = [ip,]
    return addrs[0]


def get_vdi_url(request, vname):
    instance = Instance.objects.get(name=vname)
    compute = instance.compute
    data = {}
    try:
        conn = wvmInstance(compute.hostname,
                           compute.login,
                           compute.password,
                           compute.type,
                           instance.name)

        fqdn = get_hostname_by_ip(compute.hostname)
        url = "{}://{}:{}".format(conn.get_console_type(), fqdn, conn.get_console_port())
        response = url
        return HttpResponse(response)
    
    except libvirtError as lib_err:
        err = "Error getting vdi url for {}".format(vname)
        raise Http404(err)

