#include <switch.h>
#include "switch_curl.h"
#include <curl/curl.h>

CURLcode Curl_setopt(switch_CURL *curl, CURLoption option, va_list arg);


SWITCH_DECLARE(switch_CURL *) switch_curl_easy_init(void) 
{
	return curl_easy_init();
}

SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_perform(switch_CURL *handle)
{
	return curl_easy_perform((CURL *)handle);
}


SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_getinfo(switch_CURL *curl, switch_CURLINFO info, ... )
{
	va_list ap;
	switch_CURLcode code;

	va_start(ap, info);
	code = curl_easy_getinfo(curl, info, va_arg(ap, void *));
	va_end(ap);

	return code;
}

SWITCH_DECLARE(void) switch_curl_easy_cleanup(switch_CURL *handle)
{
	curl_easy_cleanup((CURL *)handle);
}



SWITCH_DECLARE(switch_curl_slist_t *) switch_curl_slist_append(switch_curl_slist_t * list, const char * string )
{
	return (switch_curl_slist_t *) curl_slist_append((struct curl_slist *)list, string);
}


SWITCH_DECLARE(void) switch_curl_slist_free_all(switch_curl_slist_t * list)
{
	curl_slist_free_all((struct curl_slist *) list);
}

SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_setopt(CURL *handle, switch_CURLoption option, ...)
{
	va_list ap;
	switch_CURLcode code;

	va_start(ap, option);
	code = Curl_setopt(handle, option, ap);
	va_end(ap);

	return code;
}

SWITCH_DECLARE(const char *) switch_curl_easy_strerror(switch_CURLcode errornum )
{
	return curl_easy_strerror(errornum);
}

SWITCH_DECLARE(void) switch_curl_init(void)
{
	curl_global_init(CURL_GLOBAL_ALL);
}

SWITCH_DECLARE(void) switch_curl_destroy(void)
{
	curl_global_cleanup();
}

SWITCH_DECLARE(switch_status_t) switch_curl_process_form_post_params(switch_event_t *event, switch_CURL *curl_handle, struct curl_httppost **formpostp)
{

	struct curl_httppost *formpost=NULL;
	struct curl_httppost *lastptr=NULL;
	switch_event_header_t *hp;
	int go = 0;

	for (hp = event->headers; hp; hp = hp->next) {
		if (!strncasecmp(hp->name, "attach_file:", 12)) {
			go = 1;
			break;
		}
	}

	if (!go) {
		return SWITCH_STATUS_FALSE;
	}

	for (hp = event->headers; hp; hp = hp->next) {

		if (!strncasecmp(hp->name, "attach_file:", 12)) {
			char *pname = strdup(hp->name + 12);
			char *fname = strchr(pname, ':');
			
			if (fname && pname) {
				*fname++ = '\0';

				curl_formadd(&formpost,
							 &lastptr,
							 CURLFORM_COPYNAME, pname,
							 CURLFORM_FILENAME, fname,
							 CURLFORM_FILE, hp->value,
							 CURLFORM_END);
			}

			free(pname);

		} else {
			curl_formadd(&formpost,
						 &lastptr,
						 CURLFORM_COPYNAME, hp->name,
						 CURLFORM_COPYCONTENTS, hp->value,
						 CURLFORM_END);

		}
	}

	*formpostp = formpost;

	return SWITCH_STATUS_SUCCESS;

}