import re
from types import StringTypes
from django.contrib.auth import authenticate
from openstack.client import OpenStackClient
from openstack.driver import OpenStackDriver
from core.api.auth import auth_check
from core.models import Slice
from core.api.sites import _get_sites

def _get_slices(filter):
    if isinstance(filter, StringTypes) and filter.isdigit():
        filter = int(filter)
    if isinstance(filter, int):
        slices = Slice.objects.filter(id=filter)
    elif isinstance(filter, StringTypes):
        slices = Slice.objects.filter(name=filter)
    elif isinstance(filter, dict):
        slices = Slice.objects.filter(**filter)
    else:
        slices = []
    return slices
    
 
def add_slice(auth, fields):
    driver = OpenStackDriver(client = auth_check(auth))
    login_base = fields['name'][:fields['name'].find('_')]
    sites = _get_sites(login_base) 
    if sites: fields['site'] = sites[0]     
    slice = Slice(**fields)
   
    # create tenant
    nova_fields = {'tenant_name': slice.name,
                   'description': slice.description,
                   'enabled': slice.enabled}
    tenant = driver.create_tenant(**nova_fields)
    slice.tenant_id=tenant.id
    
    # create network
    network = driver.create_network(slice.name)
    slice.network_id = network['id']

    # create router
    router = driver.create_router(slice.name)
    slice.router_id = router['id']    

    slice.save()
    return slice

def update_slice(auth, id, **fields):
    driver = OpenStackDriver(client = auth_check(auth))
    slices = _get_slices(id)
    if not slices:
        return

    # update tenant
    slice = slices[0]
    nova_fields = {}
    if 'name' in fields:
        nova_fields['tenant_name'] = fields['name']
    if 'description' in fields:
        nova_fields['description'] = fields['description']
    if 'enabled' in fields:
        nova_fields['enabled'] = fields['enabled']
    driver.update_tenant(slice.tenant_id, **nova_fields)

    # update db record 
    sites = _get_sites(fields.get('site'))
    if sites: fields['site'] = sites[0]
    slice.update(**fields)

    return slice 

def delete_slice(auth, filter={}):
    driver = OpenStackDriver(client = auth_check(auth))   
    slices = _get_slices(id)
    for slice in slices:
        driver.delete_network(slice.network_id)
        driver.delete_router(slice.router_id)
        driver.delete_slice(id=slice.tenant_id) 
        slice.delete()
    return 1

def get_slices(auth, filter={}):
    user = authenticate(username=auth.get('username'),
                        password=auth.get('password'))
    if 'site' in filter:
        sites = _get_sites(filter.get('site'))
        if sites: filter['site'] = sites[0]
    slices = _get_slices(filter)
    return slices             
        

    
