/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <axis2_policy_include.h>
#include <neethi_policy.h>
#include <neethi_engine.h>

struct axis2_policy_include
{
    neethi_policy_t *policy;

    neethi_policy_t *effective_policy;

    neethi_registry_t *registry;

    axis2_desc_t *desc;

    axutil_hash_t *wrapper_elements;
};

typedef struct axis2_policy_wrapper
{
    int type;
    void *value;
} axis2_policy_wrapper_t;

AXIS2_EXTERN axis2_policy_include_t *AXIS2_CALL
axis2_policy_include_create(
    const axutil_env_t * env)
{
    axis2_policy_include_t *policy_include = NULL;

    AXIS2_ENV_CHECK(env, NULL);

    policy_include = (axis2_policy_include_t *)AXIS2_MALLOC(env->allocator,
        sizeof(axis2_policy_include_t));

    if(!policy_include)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }

    policy_include->policy = NULL;
    policy_include->effective_policy = NULL;
    policy_include->registry = NULL;
    policy_include->desc = NULL;
    policy_include->wrapper_elements = NULL;

    policy_include->registry = neethi_registry_create(env);
    if(!policy_include->registry)
    {
        axis2_policy_include_free(policy_include, env);
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }

    policy_include->wrapper_elements = axutil_hash_make(env);
    if(!policy_include->wrapper_elements)
    {
        axis2_policy_include_free(policy_include, env);
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }

    return policy_include;
}

AXIS2_EXTERN axis2_policy_include_t *AXIS2_CALL
axis2_policy_include_create_with_desc(
    const axutil_env_t * env,
    axis2_desc_t * desc)
{
    axis2_policy_include_t *policy_include = NULL;
    axis2_desc_t *parent_desc = NULL;

    AXIS2_ENV_CHECK(env, NULL);

    policy_include = (axis2_policy_include_t *)axis2_policy_include_create(env);

    parent_desc = axis2_desc_get_parent(desc, env);

    if(policy_include->registry)
    {
        neethi_registry_free(policy_include->registry, env);
        policy_include->registry = NULL;
    }

    if(parent_desc)
    {
        axis2_policy_include_t *preant_policy_include = axis2_desc_get_policy_include(parent_desc,
            env);
        if(preant_policy_include)
        {
            policy_include->registry = neethi_registry_create_with_parent(env,
                axis2_policy_include_get_registry(preant_policy_include, env));
        }
        else
        {
            policy_include->registry = neethi_registry_create(env);
        }
    }
    else
    {
        policy_include->registry = neethi_registry_create(env);
    }

    policy_include->desc = desc;

    return policy_include;
}

AXIS2_EXTERN void AXIS2_CALL
axis2_policy_include_free(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    AXIS2_ENV_CHECK(env, void);

    if(policy_include->registry)
    {
        neethi_registry_free(policy_include->registry, env);
    }

    if(policy_include->wrapper_elements)
    {
        axutil_hash_index_t *hi = NULL;
        void *val = NULL;
        for(hi = axutil_hash_first(policy_include->wrapper_elements, env); hi; hi
            = axutil_hash_next(env, hi))
        {
            axis2_policy_wrapper_t *wrapper = NULL;
            axutil_hash_this(hi, NULL, NULL, &val);
            wrapper = (axis2_policy_wrapper_t *)val;
            if(wrapper)
                AXIS2_FREE(env->allocator, wrapper);
            val = NULL;
            wrapper = NULL;
        }
        axutil_hash_free(policy_include->wrapper_elements, env);
    }

    if(policy_include)
    {
        AXIS2_FREE(env->allocator, policy_include);
    }

    return;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_set_registry(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    neethi_registry_t * registry)
{
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);

    if(policy_include->registry)
    {
        neethi_registry_free(policy_include->registry, env);
    }

    policy_include->registry = registry;

    return AXIS2_SUCCESS;
}

AXIS2_EXTERN neethi_registry_t *AXIS2_CALL
axis2_policy_include_get_registry(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    return policy_include->registry;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_set_policy(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    neethi_policy_t * policy)
{
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);

    if(policy_include->wrapper_elements)
    {
        axutil_hash_free(policy_include->wrapper_elements, env);
        policy_include->wrapper_elements = NULL;
    }

    policy_include->wrapper_elements = axutil_hash_make(env);

    if(!neethi_policy_get_name(policy, env) && !neethi_policy_get_id(policy, env))
    {
        neethi_policy_set_id(policy, env, axutil_uuid_gen(env));
    }

    if(policy_include->wrapper_elements)
    {
        axis2_policy_wrapper_t *wrapper = NULL;

        wrapper = (axis2_policy_wrapper_t *)AXIS2_MALLOC(env->allocator,
            sizeof(axis2_policy_wrapper_t));
        if(wrapper)
        {
            axis2_char_t *policy_name = NULL;
            wrapper->type = AXIS2_ANON_POLICY;
            wrapper->value = policy;

            policy_name = neethi_policy_get_name(policy, env);

            if(policy_name)
            {
                axutil_hash_set(policy_include->wrapper_elements, policy_name,
                    AXIS2_HASH_KEY_STRING, wrapper);
            }
            else
            {
                axutil_hash_set(policy_include->wrapper_elements,
                    neethi_policy_get_id(policy, env), AXIS2_HASH_KEY_STRING, wrapper);
            }
        }
    }
    return AXIS2_SUCCESS;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_update_policy(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    neethi_policy_t * policy)
{
    axis2_char_t *key;
    axis2_policy_wrapper_t *wrapper = NULL;

    key = neethi_policy_get_name(policy, env);
    if(!key)
        key = neethi_policy_get_id(policy, env);

    if(!key)
    {
        return AXIS2_FAILURE;
    }

    wrapper = axutil_hash_get(policy_include->wrapper_elements, key, AXIS2_HASH_KEY_STRING);
    if(wrapper)
    {
        wrapper->value = policy;
        return AXIS2_SUCCESS;
    }

    return AXIS2_FAILURE;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_set_effective_policy(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    neethi_policy_t * effective_policy)
{
    policy_include->effective_policy = effective_policy;
    return AXIS2_SUCCESS;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_set_desc(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    axis2_desc_t * desc)
{
    policy_include->desc = desc;
    return AXIS2_SUCCESS;
}

AXIS2_EXTERN axis2_desc_t *AXIS2_CALL
axis2_policy_include_get_desc(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    return policy_include->desc;
}

AXIS2_EXTERN axis2_policy_include_t *AXIS2_CALL
axis2_policy_include_get_parent(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    if(policy_include->desc)
    {
        axis2_desc_t *parent = NULL;
        parent = axis2_desc_get_parent(policy_include->desc, env);
        if(parent)
        {
            return axis2_desc_get_policy_include(parent, env);
        }
    }

    return NULL;
}

static axis2_status_t
axis2_policy_include_calculate_policy(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    neethi_policy_t *result = NULL;
    axutil_hash_index_t *hi = NULL;
    void *val = NULL;

    for(hi = axutil_hash_first(policy_include->wrapper_elements, env); hi; hi = axutil_hash_next(
        env, hi))
    {
        axis2_policy_wrapper_t *wrapper = NULL;

        axutil_hash_this(hi, NULL, NULL, &val);
        wrapper = (axis2_policy_wrapper_t *)val;

        if(wrapper)
        {
            neethi_policy_t *policy = NULL;
            if(wrapper->type == AXIS2_POLICY_REF)
            {
                neethi_reference_t *reference = (neethi_reference_t *)wrapper->value;
                if(reference)
                {
                    /* TOOD add neethi_reference_normalize
                     policy = (neethi_policy_t*) neethi_reference_normalize(
                     reference, env, policy_include->registry, AXIS2_FALSE);
                     */
                }
            }
            else
            {
                policy = (neethi_policy_t *)wrapper->value;
            }

            result = (result == NULL) ? (neethi_policy_t *)policy
                : (neethi_policy_t *)neethi_engine_merge(env, result, policy);
        }
    }

    policy_include->policy = result;
    return AXIS2_SUCCESS;
}

static neethi_policy_t *
axis2_policy_include_calculate_effective_policy(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    neethi_policy_t *result;
    axis2_policy_include_t *parent = NULL;

    parent = axis2_policy_include_get_parent(policy_include, env);

    if(parent)
    {
        neethi_policy_t *parent_policy = axis2_policy_include_get_effective_policy(parent, env);

        if(!parent_policy)
        {
            result = axis2_policy_include_get_policy(policy_include, env);

        }
        else
        {
            if(axis2_policy_include_get_policy(policy_include, env))
            {
                neethi_policy_t *temp_policy = NULL;
                parent_policy = (neethi_policy_t *)neethi_engine_get_normalize(env, AXIS2_FALSE,
                    parent_policy);
                temp_policy = axis2_policy_include_get_policy(policy_include, env);
                temp_policy = (neethi_policy_t *)neethi_engine_get_normalize(env, AXIS2_FALSE,
                    temp_policy);
                /* result = (neethi_policy_t*) neethi_engine_merge(env, parent_policy,
                 axis2_policy_include_get_policy(policy_include, env)); */
                result = (neethi_policy_t *)neethi_engine_merge(env, parent_policy, temp_policy);

            }
            else
            {
                result = parent_policy;
            }
        }
    }
    else
    {
        result = axis2_policy_include_get_policy(policy_include, env);
    }

    return result;
    /*policy_include->effective_policy = result;
     return AXIS2_SUCCESS; */
}

AXIS2_EXTERN neethi_policy_t *AXIS2_CALL
axis2_policy_include_get_policy(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    axis2_policy_include_calculate_policy(policy_include, env);
    return policy_include->policy;
}

AXIS2_EXTERN neethi_policy_t *AXIS2_CALL
axis2_policy_include_get_effective_policy(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    /*if (policy_include->effective_policy)
     return policy_include->effective_policy;
     */
    return axis2_policy_include_calculate_effective_policy(policy_include, env);
    /*return policy_include->effective_policy; */
}

AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
axis2_policy_include_get_policy_elements(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    axutil_array_list_t *policy_elements_list = NULL;
    axutil_hash_index_t *hi = NULL;
    void *val = NULL;

    policy_elements_list = axutil_array_list_create(env, 10);

    for(hi = axutil_hash_first(policy_include->wrapper_elements, env); hi; hi = axutil_hash_next(
        env, hi))
    {
        axis2_policy_wrapper_t *wrapper = NULL;

        axutil_hash_this(hi, NULL, NULL, &val);
        wrapper = (axis2_policy_wrapper_t *)val;

        if(wrapper)
        {
            axutil_array_list_add(policy_elements_list, env, wrapper->value);
        }
    }
    return policy_elements_list;
}

AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
axis2_policy_include_get_policy_elements_with_type(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    int type)
{
    axutil_array_list_t *policy_elements_list = NULL;
    axutil_hash_index_t *hi = NULL;
    void *val = NULL;

    policy_elements_list = axutil_array_list_create(env, 10);

    for(hi = axutil_hash_first(policy_include->wrapper_elements, env); hi; hi = axutil_hash_next(
        env, hi))
    {
        axis2_policy_wrapper_t *wrapper = NULL;

        axutil_hash_this(hi, NULL, NULL, &val);
        wrapper = (axis2_policy_wrapper_t *)val;

        if(wrapper && wrapper->type == type)
        {
            axutil_array_list_add(policy_elements_list, env, wrapper->value);
        }
    }
    return policy_elements_list;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_register_policy(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    axis2_char_t * key,
    neethi_policy_t * policy)
{
    if(policy_include->registry)
    {
        return neethi_registry_register(policy_include->registry, env, key, policy);
    }
    return AXIS2_FAILURE;
}

AXIS2_EXTERN neethi_policy_t *AXIS2_CALL
axis2_policy_include_get_policy_with_key(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    axis2_char_t * key)
{
    if(policy_include->registry)
    {
        return neethi_registry_lookup(policy_include->registry, env, key);
    }
    return NULL;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_add_policy_element(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    int type,
    neethi_policy_t * policy)
{
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);

    if(!neethi_policy_get_name(policy, env) && !neethi_policy_get_id(policy, env))
    {
        axis2_char_t *uuid = axutil_uuid_gen(env);
        neethi_policy_set_id(policy, env, uuid);
        if(uuid)
        {
            AXIS2_FREE(env->allocator, uuid);
            uuid = NULL;
        }
    }

    if(policy_include->wrapper_elements)
    {
        axis2_policy_wrapper_t *wrapper = NULL;

        wrapper = (axis2_policy_wrapper_t *)AXIS2_MALLOC(env->allocator,
            sizeof(axis2_policy_wrapper_t));
        if(wrapper)
        {
            axis2_char_t *policy_name = NULL;
            wrapper->type = type;
            wrapper->value = policy;

            policy_name = neethi_policy_get_name(policy, env);
            if(!policy_name)
                policy_name = neethi_policy_get_id(policy, env);

            if(policy_name)
            {
                axutil_hash_set(policy_include->wrapper_elements, policy_name,
                    AXIS2_HASH_KEY_STRING, wrapper);
                if(policy_include->registry)
                {
                    neethi_registry_register(policy_include->registry, env, policy_name, policy);
                }
                return AXIS2_SUCCESS;
            }
        }
    }
    return AXIS2_FAILURE;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_add_policy_reference_element(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    int type,
    neethi_reference_t * reference)
{
    axis2_policy_wrapper_t *wrapper = NULL;

    wrapper
        = (axis2_policy_wrapper_t *)AXIS2_MALLOC(env->allocator, sizeof(axis2_policy_wrapper_t));
    if(wrapper)
    {
        wrapper->type = type;
        wrapper->value = reference;
        axutil_hash_set(policy_include->wrapper_elements, neethi_reference_get_uri(reference, env),
            AXIS2_HASH_KEY_STRING, wrapper);
    }
    return AXIS2_SUCCESS;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_remove_policy_element(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env,
    axis2_char_t * policy_uri)
{
    if(policy_include->wrapper_elements)
    {
        axutil_hash_set(policy_include->wrapper_elements, policy_uri, AXIS2_HASH_KEY_STRING, NULL);
    }
    if(policy_include->registry)
    {
        neethi_registry_register(policy_include->registry, env, policy_uri, NULL);
    }
    return AXIS2_SUCCESS;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_policy_include_remove_all_policy_element(
    axis2_policy_include_t * policy_include,
    const axutil_env_t * env)
{
    if(policy_include->wrapper_elements)
    {
        axutil_hash_free(policy_include->wrapper_elements, env);
    }
    return AXIS2_SUCCESS;
}
