/**
* @file:    $RCSfile: oss_aliyun.cpp,v $
* @brief:   $aliyun oss include
*
* @version: $Revision: 1.01 $
* @date:    $Date: 2023/08/31 23:02:00 $
* @author:  $Author: wangwei $
* @state:   $State: Exp $
*
* @latest:  $Id: oss_aliyun.cpp,v 1.01 2023/08/31 23:02:00 wangwei Exp $
*
*/

using namespace std;

#include "aos_log.h"
#include "aos_util.h"
#include "aos_string.h"
#include "aos_status.h"
#include "oss_auth.h"
#include "oss_util.h"
#include "oss_api.h"
#include "../mms/db_interface.h"
#include <iostream>

char* OSS_ENDPOINT;
char* ACCESS_KEY_ID;
char* ACCESS_KEY_SECRET;
char* BUCKET_NAME;

const char OBJECT_NAME[] = "comtrade/temp.json";

void init_sample_request_options(oss_request_options_t *options, int is_cname);
void put_object_from_buffer();
void put_object_from_buffer_new(char* File_Name, char* data);
void put_object_from_file();
void put_object_from_file_new(char* File_Name, char* path);
void get_object_to_buffer();
void get_object_to_file();
void get_object_to_file_new(char* File_Name, char* savepath);
void delete_object();
void delete_object_new(char* File_Name);

void TestOSS()
{
	apr_file_t *output = NULL;
	aos_pool_t *pool = NULL;
	apr_status_t ret;

	/* 在程序入口调用aos_http_io_initialize方法来初始化网络、内存等全局资源。*/
	printf(">>>TestOSS ini Start");
	if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
		return;
	}

	printf(">>>TestOSS put Start");

	put_object_from_buffer();
	get_object_to_file();

	printf(">>>TestOSS put End");

	aos_http_io_deinitialize();

	return ;
}

void PutOSS(char* File_Name,char* data) //zw修改 2023-9-7 上送oss文件
{
	apr_file_t* output = NULL;
	aos_pool_t* pool = NULL;
	apr_status_t ret;

	/* 在程序入口调用aos_http_io_initialize方法来初始化网络、内存等全局资源。*/
	printf(">>>PutOSS ini Start");
	printf(File_Name);
	printf(data);
	if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
		return;
	}


	printf(">>>PutOSS put Start");

	put_object_from_file_new(File_Name, data);//使用buffer推送文件

	printf(">>>PutOSS put End");

	aos_http_io_deinitialize();

	return;
}

void GetOSS(char* File_Name,char* savepath) //zw修改 2023-9-7 获取oss文件
{
	apr_file_t* output = NULL;
	aos_pool_t* pool = NULL;
	apr_status_t ret;

	/* 在程序入口调用aos_http_io_initialize方法来初始化网络、内存等全局资源。*/
	printf(">>>GetOSS ini Start");
	if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
		return;
	}

	printf(">>>GetOSS put Start");

	get_object_to_file_new(File_Name,savepath);//使用buffer推送文件

	printf(">>>GetOSS put End");

	aos_http_io_deinitialize();

	return;
}

void DelOSS(char* File_Name)
{
	apr_file_t* output = NULL;
	aos_pool_t* pool = NULL;
	apr_status_t ret;

	/* 在程序入口调用aos_http_io_initialize方法来初始化网络、内存等全局资源。*/
	printf(">>>DelOSS ini Start");
	if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
		return;
	}

	printf(">>>DelOSS put Start");

	delete_object_new(File_Name);//使用buffer推送文件

	printf(">>>DelOSS put End");

	aos_http_io_deinitialize();

	return;
}

void coutTest() 
{
	std:: cout << "OSS_ENDPOINT:" << OSS_ENDPOINT << std::endl;
	std::cout << "ACCESS_KEY_ID:" << ACCESS_KEY_ID << std::endl;
	std::cout << "ACCESS_KEY_SECRET:" << ACCESS_KEY_SECRET << std::endl;
	std::cout << "BUCKET_NAME:" << BUCKET_NAME << std::endl;
}

void init_sample_request_options(oss_request_options_t *options, int is_cname)
{
	options->config = oss_config_create(options->pool);
	aos_str_set(&options->config->endpoint, OSS_ENDPOINT);
	aos_str_set(&options->config->access_key_id, ACCESS_KEY_ID);
	aos_str_set(&options->config->access_key_secret, ACCESS_KEY_SECRET);
	options->config->is_cname = is_cname;
	options->ctl = aos_http_controller_create(options->pool, 0);
}

void put_object_from_buffer()
{
	aos_pool_t *p = NULL;
	aos_string_t bucket;
	aos_string_t object;
	int is_cname = 0;
	aos_table_t *headers = NULL;
	aos_table_t *resp_headers = NULL;
	oss_request_options_t *options = NULL;
	aos_list_t buffer;
	aos_buf_t *content = NULL;
	char *str = "test oss c sdk";
	aos_status_t *s = NULL;

	aos_pool_create(&p, NULL);
	options = oss_request_options_create(p);
	init_sample_request_options(options, is_cname);
	headers = aos_table_make(p, 1);
	apr_table_set(headers, "x-oss-meta-author", "oss");
	aos_str_set(&bucket, BUCKET_NAME);
	aos_str_set(&object, OBJECT_NAME);

	aos_list_init(&buffer);
	content = aos_buf_pack(options->pool, str, strlen(str));
	aos_list_add_tail(&content->node, &buffer);

	s = oss_put_object_from_buffer(options, &bucket, &object,
		&buffer, headers, &resp_headers);

	if (aos_status_is_ok(s)) {
		printf("put object from buffer succeeded\n");
	}
	else {
		printf("put object from buffer failed\n");
	}

	aos_pool_destroy(p);
}

void put_object_from_buffer_new(char* File_Name,char* data)//zw修改 2023-9-7 oss推送
{
	aos_pool_t* p = NULL;
	aos_string_t bucket;
	aos_string_t object;
	int is_cname = 0;
	aos_table_t* headers = NULL;
	aos_table_t* resp_headers = NULL;
	oss_request_options_t* options = NULL;
	aos_list_t buffer;
	aos_buf_t* content = NULL;
	char* str = data;
	aos_status_t* s = NULL;
	aos_pool_create(&p, NULL);
	options = oss_request_options_create(p);
	init_sample_request_options(options, is_cname);
	headers = aos_table_make(p, 1);
	apr_table_set(headers, "x-oss-meta-author", "oss");
	aos_str_set(&bucket, BUCKET_NAME);
	aos_str_set(&object, File_Name);

	aos_list_init(&buffer);
	content = aos_buf_pack(options->pool, str, strlen(str));
	aos_list_add_tail(&content->node, &buffer);

	s = oss_put_object_from_buffer(options, &bucket, &object,
		&buffer, headers, &resp_headers);

	if (aos_status_is_ok(s)) {
		printf("put object from buffer succeeded\n");
	}
	else {
		printf("put object from buffer failed\n");
	}

	aos_pool_destroy(p);
}

void put_object_from_file()
{
	aos_pool_t *p = NULL;
	aos_string_t bucket;
	aos_string_t object;
	/* 是否使用了CNAME。0表示不使用。*/
	int is_cname = 0;
	aos_table_t *headers = NULL;
	aos_table_t *resp_headers = NULL;
	oss_request_options_t *options = NULL;
	char *filename = "/home/pq/FeProject/etc/Device_Config.xml";
	aos_status_t *s = NULL;
	aos_string_t file;

	/* 用于内存管理的内存池（pool），等价于apr_pool_t。其实现代码在apr库中。*/
	aos_pool_create(&p, NULL);
	/* 创建并初始化options，该参数包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
	options = oss_request_options_create(p);
	init_sample_request_options(options, is_cname);
	aos_str_set(&bucket, BUCKET_NAME);
	aos_str_set(&object, OBJECT_NAME);
	aos_str_set(&file, filename);

	s = oss_put_object_from_file(options, &bucket, &object, &file,
		headers, &resp_headers);

	if (aos_status_is_ok(s)) {
		printf("put object from file succeeded\n");
	}
	else {
		printf("put object from file failed, code:%d, error_code:%s, error_msg:%s, request_id:%s\n",
			s->code, s->error_code, s->error_msg, s->req_id);
	}

	aos_pool_destroy(p);
}

void put_object_from_file_new(char* File_Name, char* path)
{
	aos_pool_t* p = NULL;
	aos_string_t bucket;
	aos_string_t object;
	/* 是否使用了CNAME。0表示不使用。*/
	int is_cname = 0;
	aos_table_t* headers = NULL;
	aos_table_t* resp_headers = NULL;
	oss_request_options_t* options = NULL;
	char* filename = path;
	aos_status_t* s = NULL;
	aos_string_t file;

	/* 用于内存管理的内存池（pool），等价于apr_pool_t。其实现代码在apr库中。*/
	aos_pool_create(&p, NULL);
	/* 创建并初始化options，该参数包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
	options = oss_request_options_create(p);
	init_sample_request_options(options, is_cname);
	aos_str_set(&bucket, BUCKET_NAME);
	aos_str_set(&object, File_Name);
	aos_str_set(&file, filename);

	s = oss_put_object_from_file(options, &bucket, &object, &file,
		headers, &resp_headers);
	if (aos_status_is_ok(s)) {
		printf("put object from file succeeded\n");
	}
	else {
		printf("put object from file failed, code:%d, error_code:%s, error_msg:%s, request_id:%s\n",s->code, s->error_code, s->error_msg, s->req_id);
	}

	aos_pool_destroy(p);
}

void get_object_to_buffer()
{
	aos_pool_t *p = NULL;
	aos_string_t bucket;
	aos_string_t object;
	int is_cname = 0;
	oss_request_options_t *options = NULL;
	aos_table_t *headers = NULL;
	aos_table_t *params = NULL;
	aos_table_t *resp_headers = NULL;
	aos_status_t *s = NULL;
	aos_list_t buffer;
	aos_buf_t *content = NULL;
	char *buf = NULL;
	int64_t len = 0;
	int64_t size = 0;
	int64_t pos = 0;

	aos_pool_create(&p, NULL);
	options = oss_request_options_create(p);
	init_sample_request_options(options, is_cname);
	aos_str_set(&bucket, BUCKET_NAME);
	aos_str_set(&object, OBJECT_NAME);
	aos_list_init(&buffer);

	s = oss_get_object_to_buffer(options, &bucket, &object,
		headers, params, &buffer, &resp_headers);

	if (aos_status_is_ok(s)) {
		printf("get object to buffer succeeded\n");
	}
	else {
		printf("get object to buffer failed\n");
	}

	//get buffer len
	aos_list_for_each_entry(aos_buf_t, content, &buffer, node) {
		len += aos_buf_size(content);
	}

	buf = (char*)aos_pcalloc(p, (apr_size_t)(len + 1));
	buf[len] = '\0';

	//copy buffer content to memory
	aos_list_for_each_entry(aos_buf_t, content, &buffer, node) {
		size = aos_buf_size(content);
		memcpy(buf + pos, content->pos, (size_t)size);
		pos += size;
	}

	aos_pool_destroy(p);
}

void get_object_to_file()
{
	aos_pool_t *p = NULL;
	aos_string_t bucket;
	char *download_filename = "Data/tempbuff.jpg";
	aos_string_t object;
	int is_cname = 0;
	oss_request_options_t *options = NULL;
	aos_table_t *headers = NULL;
	aos_table_t *params = NULL;
	aos_table_t *resp_headers = NULL;
	aos_status_t *s = NULL;
	aos_string_t file;

	aos_pool_create(&p, NULL);
	options = oss_request_options_create(p);
	init_sample_request_options(options, is_cname);
	aos_str_set(&bucket, BUCKET_NAME);
	aos_str_set(&object, OBJECT_NAME);
	headers = aos_table_make(p, 0);
	aos_str_set(&file, download_filename);

	s = oss_get_object_to_file(options, &bucket, &object, headers,
		params, &file, &resp_headers);

	if (aos_status_is_ok(s)) {
		printf("get object to local file succeeded\n");
	}
	else {
		printf("get object to local file failed\n");
	}

	aos_pool_destroy(p);
}

void get_object_to_file_new(char* File_Name,char* savepath)
{
	aos_pool_t* p = NULL;
	aos_string_t bucket;
	char* download_filename = savepath;
	aos_string_t object;
	int is_cname = 0;
	oss_request_options_t* options = NULL;
	aos_table_t* headers = NULL;
	aos_table_t* params = NULL;
	aos_table_t* resp_headers = NULL;
	aos_status_t* s = NULL;
	aos_string_t file;

	aos_pool_create(&p, NULL);
	options = oss_request_options_create(p);
	init_sample_request_options(options, is_cname);
	aos_str_set(&bucket, BUCKET_NAME);
	aos_str_set(&object, File_Name);
	headers = aos_table_make(p, 0);
	aos_str_set(&file, download_filename);

	s = oss_get_object_to_file(options, &bucket, &object, headers,
		params, &file, &resp_headers);

	if (aos_status_is_ok(s)) {
		printf("get object to local file succeeded\n");
	}
	else {
		printf("get object to local file failed\n");
	}

	aos_pool_destroy(p);
}

void delete_object()
{
	aos_pool_t *p = NULL;
	aos_string_t bucket;
	aos_string_t object;
	int is_cname = 0;
	oss_request_options_t *options = NULL;
	aos_table_t *resp_headers = NULL;
	aos_status_t *s = NULL;

	aos_pool_create(&p, NULL);
	options = oss_request_options_create(p);
	init_sample_request_options(options, is_cname);
	aos_str_set(&bucket, BUCKET_NAME);
	aos_str_set(&object, OBJECT_NAME);

	s = oss_delete_object(options, &bucket, &object, &resp_headers);

	if (aos_status_is_ok(s)) {
		printf("delete object succeed\n");
	}
	else {
		printf("delete object failed\n");
	}

	aos_pool_destroy(p);
}

void delete_object_new(char* File_Name)
{
	aos_pool_t* p = NULL;
	aos_string_t bucket;
	aos_string_t object;
	int is_cname = 0;
	oss_request_options_t* options = NULL;
	aos_status_t* s = NULL;

	aos_pool_create(&p, NULL);
	options = oss_request_options_create(p);
	init_sample_request_options(options, is_cname);
	aos_str_set(&bucket, BUCKET_NAME);
	aos_str_set(&object, File_Name);

	s = oss_delete_objects_by_prefix(options, &bucket, &object);

	if (aos_status_is_ok(s)) {
		printf("delete object succeed\n");
	}
	else {
		printf("delete object failed\n");
	}

	aos_pool_destroy(p);
}
