#ifndef __CSV_EXPORTER__
#define __CSV_EXPORTER__

extern "C"
{
#include "stdint.h"
}

namespace CSV_Type
{
    // 错误类型
    typedef enum
    {
        CSV_ERROR_NONE,                    // None Error
        CSV_ERROR_MEM_ALLOCATE_FAILED,     // 内存分配失败
        CSV_ERROR_COLUMN_NOT_FOUND,        // 未查找到指定列
        CSV_ERROR_ILLEGAL_COLUMN_POSITION, // 非法列位置
        CSV_ERROR_ILLEGAL_CELL_POSITION,   // 非法单元格位置
        CSV_ERROR_FILE_CREATE_FAILED,      // 文件创建失败
        CSV_ERROR_FILE_WRITE_FAILED,       // 文件写入失败
    } CSV_Err;

}

class CSV_Table
{
protected:
    size_t mem_use;           // 存储占用
    size_t column_count;      // 列计数
    size_t max_element_depth; // 最大元素深度

    struct Column_List_Node_Struct
    {
        char *column_title_str; // 列标题
        size_t element_count;   // 下属内容长度

        struct Cell_List_Node // 单元格节点
        {
            char *content_str;             // 内容字符串
            Cell_List_Node *p_next_cell;   // 列表索引
        } *Cell_List_Head, *Cell_List_End; // 表头、表尾

        Column_List_Node_Struct *p_next_column; // 下一列
    } *Column_List_Head, *Column_List_End;      // 列表横向表头、表尾

public:
    // 构造函数
    CSV_Table();
    // 析构函数
    ~CSV_Table();

    /**
     * @brief   清理缓存数据并回到空白状态
     * @param   null
     * @return  null
     */
    void reset();

    /**
     * @brief   在末尾新增列
     * @param   title_name_str  列标题
     * @return  CSV_Err         错误类型
     */
    CSV_Type::CSV_Err append_column(const char *title_name_str);

    /**
     * @brief   在指定标题的列表后新增列
     * @param   target_column_title_str 目标列标题
     * @param   title_name_str          插入的列标题
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err insert_column_after(const char *target_column_title_str, const char *title_name_str);

    /**
     * @brief   在指定标题的列表后新增列
     * @param   target_column_position  目标列位置
     * @param   title_name_str          插入的列标题
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err insert_column_after(size_t target_column_position, const char *title_name_str);

    /**
     * @brief   在指定标题的列表前新增列
     * @param   target_column_title_str 目标列标题
     * @param   title_name_str          插入的列标题
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err insert_column_before(const char *target_column_title_str, const char *title_name_str);

    /**
     * @brief   在指定标题的列表前新增列
     * @param   target_column_position  目标列位置
     * @param   title_name_str          插入的列标题
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err insert_column_before(size_t target_column_position, const char *title_name_str);

    /**
     * @brief   指定列末尾新增单元格
     * @param   target_column_title_str 列标题
     * @param   cell_content_str        单元格内容串
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err append_cell(const char *target_column_title_str, const char *cell_content_str);

    /**
     * @brief   指定列末尾新增单元格
     * @param   target_column_position  列位置计数
     * @param   cell_content_str        单元格内容串
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err append_cell(size_t target_column_position, const char *cell_content_str);

    /**
     * @brief   在指定标题的列中指定单元格后插入
     * @param   target_column_title_str 目标列标题
     * @param   target_cell_position    目标单元格位置
     * @param   cell_content_str        单元格内容串
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err insert_cell_after(const char *target_column_title_str, size_t target_cell_position, const char *cell_content_str);

    /**
     * @brief   在指定标题的列中指定单元格后插入
     * @param   target_column_title_str 目标列标题
     * @param   target_cell_position    目标单元格位置
     * @param   cell_content_str        单元格内容串
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err insert_cell_after(size_t target_column_position, size_t target_cell_position, const char *cell_content_str);

    /**
     * @brief   在指定标题的列中指定单元格前插入
     * @param   target_column_title_str 目标列标题
     * @param   target_cell_position    目标单元格位置
     * @param   cell_content_str        单元格内容串
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err insert_cell_before(const char *target_column_title_str, size_t target_cell_position, const char *cell_content_str);

    /**
     * @brief   在指定标题的列中指定单元格前插入
     * @param   target_column_title_str 目标列标题
     * @param   target_cell_position    目标单元格位置
     * @param   cell_content_str        单元格内容串
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err insert_cell_before(size_t target_column_position, size_t target_cell_position, const char *cell_content_str);

    /**
     * @brief   导出到指定文件
     * @param   file_name_str           目标文件名
     * @return  CSV_Err                 错误类型
     */
    CSV_Type::CSV_Err export_to_file(const char *file_name_str);
};

#endif