# Copyright (c) 2017 Wind River Systems, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#       http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

import json
import logging
import re

from rest_framework import status
from newton.pub.exceptions import VimDriverNewtonException
from newton.pub.utils.restcall import req_by_msb,req_to_aai


logger = logging.getLogger(__name__)

tisr4 = {
    "createTime": "2017-04-01 02:22:27",
    "domain": "Default",
    "name": "TiS_R4",
    "password": "admin",
    "tenant": "admin",
    "type": "openstack",
    "url": "http://192.168.0.10:5000/v3",
    "userName": "admin",
    "vendor": "OpenStack",
    "version": "ocata",
    "vimId": "openstack-hudson-dc_RegionOne",
    'cloud_owner':'openstack-hudson-dc',
    'cloud_region_id':'RegionOne',
    'cloud_extra_info':'',
    'cloud_epa_caps':'{"huge_page":"true","cpu_pinning":"true",\
        "cpu_thread_policy":"true","numa_aware":"true","sriov":"true",\
        "dpdk_vswitch":"true","rdt":"false","numa_locality_pci":"true"}',
    'insecure':'True',
}

#    "vimId": "6e720f68-34b3-44f0-a6a4-755929b20393"

def mock_get_vim_by_id(method):
    def wrapper(vimid):
        return tisr4
    return wrapper

def mock_delete_vim_by_id(method):
    def wrapper(vimid):
        return status.HTTP_202_ACCEPTED
    return wrapper

#def get_vims():
#    retcode, content, status_code = \
#        req_by_msb("/api/aai-cloudInfrastructure/v1/cloud-infrastructure/cloud-regions", "GET")
#    if retcode != 0:
#        logger.error("Status code is %s, detail is %s.", status_code, content)
#        raise VimDriverNewtonException("Failed to query VIMs from extsys.")
#    return json.JSONDecoder().decode(content)

@mock_get_vim_by_id
def get_vim_by_id(vim_id):

    cloud_owner,cloud_region_id = decode_vim_id(vim_id)

    if cloud_owner and cloud_region_id:
        retcode, content, status_code = \
            req_to_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s"
                       % (cloud_owner,cloud_region_id),"GET")
        if retcode != 0:
            logger.error("Status code is %s, detail is %s.", status_code, content)
            raise VimDriverNewtonException(
                "Failed to query VIM with id (%s:%s,%s)." % (vim_id,cloud_owner,cloud_region_id),
                status_code, content)
        tmp_viminfo = json.JSONDecoder().decode(content)

        #assume esr-system-info-id is composed by {cloud-owner} _ {cloud-region-id}
        retcode2,content2,status_code2 = \
            req_to_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s"
                       + "/esr-system-info-list/esr-system-info/%s_%s" \
                       % (cloud_owner,cloud_region_id,cloud_owner,cloud_region_id),
                       "GET")
        if retcode2 != 0:
            logger.error("Status code is %s, detail is %s.", status_code, content)
            raise VimDriverNewtonException(
                "Failed to query ESR system with id (%s:%s,%s)." % (vim_id,cloud_owner,cloud_region_id),
                status_code, content)
        tmp_authinfo = json.JSONDecoder().decode(content2)

        #convert vim information

        if tmp_viminfo:
            viminfo = {}
            viminfo['vimId'] = vim_id
            viminfo['cloud_owner'] = cloud_owner
            viminfo['cloud_region_id'] = cloud_region_id
            viminfo['type'] = tmp_viminfo['cloud-type']
            viminfo['name'] = tmp_viminfo['complex-name']
            viminfo['version'] = tmp_viminfo['cloud-region-version']
            viminfo['cloud_extra_info'] = tmp_viminfo['cloud-extra-info']
            viminfo['cloud_epa_caps'] = tmp_viminfo['cloud-epa-caps']

            if tmp_authinfo:
                viminfo['userName'] = tmp_authinfo['user-name']
                viminfo['password'] = tmp_authinfo['password']
                viminfo['domain'] = tmp_authinfo['cloud-domain']
                viminfo['url'] = tmp_authinfo['service-url']
                viminfo['tenant'] = tmp_authinfo['default-tenant']
                viminfo['cacert'] = tmp_authinfo['ssl-cacert']
                viminfo['insecure'] = tmp_authinfo['ssl-insecure']
            else:
                return None

            return viminfo
        else:
            return None
    else:
        return None

@mock_delete_vim_by_id
def delete_vim_by_id(vim_id):
    cloud_owner, cloud_region_id = decode_vim_id(vim_id)
    if cloud_owner and cloud_region_id:
        retcode, content, status_code = \
            req_to_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s"
                       % ( cloud_owner, cloud_region_id), "DELETE")
        if retcode != 0:
            logger.error("Status code is %s, detail is %s.", status_code, content)
            raise VimDriverNewtonException(
                "Failed to delete VIM in AAI with id (%s:%s,%s)." % (vim_id,cloud_owner,cloud_region_id),
                status_code, content)
        return 0
    # return non zero if failed to decode cloud owner and region id
    return 1

def decode_vim_id(vim_id):
    m = re.search(r'^([0-9a-zA-Z-]+)_([0-9a-zA-Z_-]+)$', vim_id)
    cloud_owner, cloud_region_id = m.group(1), m.group(2)
    return cloud_owner, cloud_region_id