from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from computes.models import Compute
from interfaces.forms import AddInterface
from vrtManager.interface import wvmInterface, wvmInterfaces
from libvirt import libvirtError


def interfaces(request, compute_id):
    """
    :param request:
    :return:
    """

    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('index'))

    if not request.user.is_superuser:
        return HttpResponseRedirect(reverse('index'))

    ifaces_all = []
    error_messages = []
    compute = Compute.objects.get(id=compute_id)

    try:
        conn = wvmInterfaces(compute.hostname,
                             compute.login,
                             compute.password,
                             compute.type)
        ifaces = conn.get_ifaces()
        try:
            netdevs = conn.get_net_device()
        except:
            netdevs = ['eth0', 'eth1']

        for iface in ifaces:
            ifaces_all.append(conn.get_iface_info(iface))

        if request.method == 'POST':
            if 'create' in request.POST:
                form = AddInterface(request.POST)
                if form.is_valid():
                    data = form.cleaned_data
                    conn.create_iface(data['name'], data['itype'], data['start_mode'], data['netdev'],
                                      data['ipv4_type'], data['ipv4_addr'], data['ipv4_gw'],
                                      data['ipv6_type'], data['ipv6_addr'], data['ipv6_gw'],
                                      data['stp'], data['delay'])
                    return HttpResponseRedirect(request.get_full_path())
                else:
                    for msg_err in form.errors.values():
                        error_messages.append(msg_err.as_text())
        conn.close()
    except libvirtError as lib_err:
        error_messages.append(lib_err)

    return render(request, 'interfaces.html', locals())


def interface(request, compute_id, iface):
    """
    :param request:
    :return:
    """

    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('index'))

    if not request.user.is_superuser:
        return HttpResponseRedirect(reverse('index'))

    ifaces_all = []
    error_messages = []
    compute = Compute.objects.get(id=compute_id)

    try:
        conn = wvmInterface(compute.hostname,
                            compute.login,
                            compute.password,
                            compute.type,
                            iface)
        start_mode = conn.get_start_mode()
        state = conn.is_active()
        mac = conn.get_mac()
        itype = conn.get_type()
        ipv4 = conn.get_ipv4()
        ipv4_type = conn.get_ipv4_type()
        ipv6 = conn.get_ipv6()
        ipv6_type = conn.get_ipv6_type()
        bridge = conn.get_bridge()

        if request.method == 'POST':
            if 'stop' in request.POST:
                conn.stop_iface()
                return HttpResponseRedirect(request.get_full_path())
            if 'start' in request.POST:
                conn.start_iface()
                return HttpResponseRedirect(request.get_full_path())
            if 'delete' in request.POST:
                conn.delete_iface()
                return HttpResponseRedirect(reverse('interfaces', args=[compute_id]))
        conn.close()
    except libvirtError as lib_err:
        error_messages.append(lib_err)

    return render(request, 'interface.html', locals())