/*
 * 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_cgi_out_transport_info.h"
#include "axis2_cgi_stream.h"

#include <stdio.h>
#include <stdlib.h>
#include <axutil_error_default.h>
#include <axutil_log_default.h>
#include <axutil_thread_pool.h>
#include <axutil_types.h>
#include <axutil_version.h>
#include <axutil_file_handler.h>
#include <axutil_url.h>
#include <axutil_string.h>
#include <platforms/axutil_platform_auto_sense.h>

#include <axis2_engine.h>
#include <axis2_conf_init.h>
#include <axis2_http_transport_utils.h>

axis2_char_t *axis2_cgi_default_url_prefix = "/cgi-bin/axis2.cgi/";

/***************************** Function headers *******************************/

void
axis2_cgi_system_exit(
    axutil_env_t * env,
    int status);

void
axis2_cgi_set_request_vars(
    axis2_cgi_request_t *cgi_request);

axis2_status_t
axis2_cgi_write_response(
    const void *buffer,
    unsigned int length);

/***************************** End of function headers ************************/

int
main(
    int argc,
    char *argv[])
{
    axutil_allocator_t *allocator = NULL;
    axutil_env_t *env = NULL;
    const axis2_char_t *repo_path;
    axis2_conf_ctx_t *conf_ctx;
    axis2_cgi_request_t *cgi_request = NULL;
    int content_length = 0;
    axis2_char_t *request_url = NULL;
    /* axutil_stream_t *request_body_stream = NULL; */
    axutil_stream_t *out_stream = NULL;
    axis2_transport_in_desc_t *in_desc = NULL;
    axis2_transport_out_desc_t *out_desc = NULL;
    /* axis2_msg_ctx_t *msg_ctx = NULL; */
    /* axis2_bool_t processed = AXIS2_FALSE; */
    axis2_http_transport_in_t request;
    axis2_http_transport_out_t response;
    /*axis2_http_header_t* http_header = NULL; */
    /*axutil_hash_t *headers = NULL; */
    /* axis2_char_t *axis2_cgi_url_prefix = NULL; */

    if(!(repo_path = AXIS2_GETENV("AXIS2C_HOME")))
    {
        fprintf(stderr, "Error: AXIS2C_HOME environment variable not set!");
        axis2_cgi_system_exit(env, -1);
    }

    allocator = axutil_allocator_init(NULL);
    env = axutil_env_create(allocator);

    if(axutil_file_handler_access(repo_path, AXIS2_R_OK) != AXIS2_SUCCESS)
    {
        fprintf(stderr, "Error reading repository: %s\nPlease check AXIS2C_HOME var", repo_path);
        axis2_cgi_system_exit(env, -1);
    }

    /* Set configuration */

    conf_ctx = axis2_build_conf_ctx(env, repo_path);
    if(!conf_ctx)
    {
        fprintf(stderr, "Error: Configuration not builded propertly\n");
        axis2_cgi_system_exit(env, -1);
    }

    axis2_http_transport_utils_transport_out_init(&response, env);
    axis2_http_transport_utils_transport_in_init(&request, env);

    /* Get input info */

    cgi_request = AXIS2_MALLOC(allocator, sizeof(axis2_cgi_request_t));
    axis2_cgi_set_request_vars(cgi_request);

    request_url = (axis2_char_t *)AXIS2_MALLOC(allocator, (7 + /* "http:" */
    strlen(cgi_request->server_name) + ((strlen(cgi_request->server_port)) ? 1 : 0) + /* ":"*/
    strlen(cgi_request->server_port) + strlen(cgi_request->script_name) + strlen(
        cgi_request->path_info) + ((strlen(cgi_request->path_info)) ? 1 : 0) + /* "?" */
    strlen(cgi_request->query_string)) * sizeof(axis2_char_t));

    request_url[0] = '\0';

    strcat(request_url, "http://");
    strcat(request_url, cgi_request->server_name);
    if(strlen(cgi_request->server_port))
        strcat(request_url, ":");
    strcat(request_url, cgi_request->server_port);
    strcat(request_url, cgi_request->script_name);
    strcat(request_url, cgi_request->path_info);
    if(strlen(cgi_request->query_string))
        strcat(request_url, "?");
    strcat(request_url, cgi_request->query_string);

    if(cgi_request->content_length)
        content_length = axutil_atoi(cgi_request->content_length);
    else
        content_length = 0;

    /* Set streams */

    out_stream = axutil_stream_create_basic(env);

    /* Set message contexts */

    out_desc = axis2_conf_get_transport_out(axis2_conf_ctx_get_conf(conf_ctx, env), env,
        AXIS2_TRANSPORT_ENUM_HTTP);
    in_desc = axis2_conf_get_transport_in(axis2_conf_ctx_get_conf(conf_ctx, env), env,
        AXIS2_TRANSPORT_ENUM_HTTP);

    request.msg_ctx = axis2_msg_ctx_create(env, conf_ctx, in_desc, out_desc);

    axis2_msg_ctx_set_server_side(request.msg_ctx, env, AXIS2_TRUE);
    axis2_msg_ctx_set_transport_out_stream(request.msg_ctx, env, out_stream);
    axis2_msg_ctx_set_transport_headers(request.msg_ctx, env, NULL);

    /* Set request parameters */

    request.soap_action = cgi_request->soap_action;
    request.in_stream = axutil_stream_create_cgi(env, content_length);
    request.remote_ip = cgi_request->remote_addr;
    request.content_length = content_length;
    request.content_type = cgi_request->content_type;
    request.request_uri = request_url;
    request.svr_port = cgi_request->server_port;
    request.accept_header = AXIS2_GETENV("HTTP_ACCEPT");
    request.accept_language_header = AXIS2_GETENV("HTTP_ACCEPT_LANGUAGE");
    request.accept_charset_header = AXIS2_GETENV("HTTP_ACCEPT_CHARSET");
    request.request_url_prefix = (AXIS2_GETENV("AXIS2C_URL_PREFIX")) ? AXIS2_GETENV(
        "AXIS2C_URL_PREFIX") : axis2_cgi_default_url_prefix;

    if(axutil_strcasecmp(cgi_request->request_method, "POST") == 0)
    {
        request.request_method = AXIS2_HTTP_METHOD_POST;
    }
    else if(axutil_strcasecmp(cgi_request->request_method, "GET") == 0)
    {
        request.request_method = AXIS2_HTTP_METHOD_GET;
    }
    else if(axutil_strcasecmp(cgi_request->request_method, "HEAD") == 0)
    {
        request.request_method = AXIS2_HTTP_METHOD_HEAD;
    }
    else if(axutil_strcasecmp(cgi_request->request_method, "PUT") == 0)
    {
        request.request_method = AXIS2_HTTP_METHOD_PUT;
    }
    else if(axutil_strcasecmp(cgi_request->request_method, "DELETE") == 0)
    {
        request.request_method = AXIS2_HTTP_METHOD_DELETE;
    }

    request.out_transport_info = axis2_cgi_out_transport_info_create(env, cgi_request);

    /*Process request */
    fprintf(stderr, "ok\n");
    axis2_http_transport_utils_process_request(env, conf_ctx, &request, &response);
    fprintf(stderr, "ok\n");
    /*Send status */

    fprintf(stdout, "Status: %d %s \r\n", response.http_status_code, response.http_status_code_name);

    if(response.content_type)
    {
        fprintf(stdout, "Content-type: %s \r\n", response.content_type);
    }
    else if(strlen(axis2_cgi_out_transport_get_content(request.out_transport_info))
        && axis2_cgi_out_transport_get_content(request.out_transport_info))
    {
        fprintf(stdout, "Content-type: %s \r\n", axis2_cgi_out_transport_get_content(
            request.out_transport_info));
    }

    fprintf(stdout, "\r\n"); /* End of headers for server */

    /* Write data body */
    if(!axis2_cgi_write_response(response.response_data, response.response_data_length))
    {
        fprintf(stderr, "Error writing output data\n");
    }

    axis2_http_transport_utils_transport_in_uninit(&request, env);
    axis2_http_transport_utils_transport_out_uninit(&response, env);

    return 0;
}

axis2_status_t
axis2_cgi_write_response(
    const void *buffer,
    unsigned int length)
{
    if(buffer && length)
    {
        size_t completed = 0;
        size_t written = 0;

        while(completed < length)
        {
            written = fwrite(buffer, sizeof(char), length - completed, stdout);
            if(written < 0)
                return AXIS2_FALSE;
            completed += written;
        }
    }
    return AXIS2_TRUE;
}

void
axis2_cgi_set_request_vars(
    axis2_cgi_request_t *cgi_request)
{
    cgi_request->server_name = (AXIS2_GETENV("SERVER_NAME")) ? AXIS2_GETENV("SERVER_NAME") : "";
    cgi_request->script_name = (AXIS2_GETENV("SCRIPT_NAME")) ? AXIS2_GETENV("SCRIPT_NAME") : "";
    cgi_request->path_info = (AXIS2_GETENV("PATH_INFO")) ? AXIS2_GETENV("PATH_INFO") : "";
    cgi_request->server_port = (AXIS2_GETENV("SERVER_PORT")) ? AXIS2_GETENV("SERVER_PORT") : "";
    cgi_request->server_protocol = (AXIS2_GETENV("SERVER_PROTOCOL")) ? AXIS2_GETENV(
        "SERVER_PROTOCOL") : "";
    cgi_request->content_length = (AXIS2_GETENV("CONTENT_LENGTH")) ? AXIS2_GETENV("CONTENT_LENGTH")
        : "";
    cgi_request->content_type = (AXIS2_GETENV("CONTENT_TYPE")) ? AXIS2_GETENV("CONTENT_TYPE") : "";
    cgi_request->request_method = (AXIS2_GETENV("REQUEST_METHOD")) ? AXIS2_GETENV("REQUEST_METHOD")
        : "";
    cgi_request->remote_addr = (AXIS2_GETENV("REMOTE_ADDR")) ? AXIS2_GETENV("REMOTE_ADDR") : "";
    cgi_request->soap_action = (AXIS2_GETENV("HTTP_SOAPACTION")) ? AXIS2_GETENV("HTTP_SOAPACTION")
        : NULL;
    cgi_request->query_string = (AXIS2_GETENV("QUERY_STRING")) ? AXIS2_GETENV("QUERY_STRING") : "";
}

void
axis2_cgi_system_exit(
    axutil_env_t * env,
    int status)
{
    axutil_allocator_t *allocator = NULL;

    if(env)
    {
        allocator = env->allocator;
        axutil_env_free(env);
    }
    exit(status);
}
