#include "FLASH_SPIFS.h"
#include "esp_spiffs.h"
#include "esp_log.h"

#define TAG "FLASH_SPIFS"
#define MOUNT_POINT "/flash"

static bool is_mounted = false;

esp_err_t flash_spiffs_init(void)
{
    ESP_LOGI(TAG, "正在初始化SPIFFS文件系统...");

    esp_vfs_spiffs_conf_t conf = {
        .base_path = MOUNT_POINT,
        .partition_label = "storage",
        .max_files = 20,
        .format_if_mount_failed = true
    };

    esp_err_t ret = esp_vfs_spiffs_register(&conf);
    if (ret != ESP_OK) {
        if (ret == ESP_FAIL) {
            ESP_LOGE(TAG, "无法挂载或格式化文件系统");
        } else if (ret == ESP_ERR_NOT_FOUND) {
            ESP_LOGE(TAG, "找不到分区 'storage'");
        } else {
            ESP_LOGE(TAG, "初始化失败 (%s)", esp_err_to_name(ret));
        }
        return ret;
    }

    size_t total = 0, used = 0;
    ret = esp_spiffs_info(conf.partition_label, &total, &used);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "获取文件系统信息失败: %s", esp_err_to_name(ret));
        esp_vfs_spiffs_unregister(conf.partition_label);
        return ret;
    }

    is_mounted = true;

    ESP_LOGI(TAG, "SPIFFS文件系统挂载成功");
    ESP_LOGI(TAG, "总空间: %u 字节", total);
    ESP_LOGI(TAG, "已用空间: %u 字节", used);
    ESP_LOGI(TAG, "可用空间: %u 字节", total - used);
    ESP_LOGI(TAG, "挂载点: %s", MOUNT_POINT);

    // 注意: 文件系统检查 (esp_spiffs_check) 在初始化阶段耗时过长，可能触发看门狗
    // 如果需要检查文件系统完整性，可以在单独的任务中调用 flash_spiffs_format() 格式化

    return ESP_OK;
}

bool flash_spiffs_is_mounted(void)
{
    return is_mounted;
}

uint32_t flash_spiffs_get_total_size(void)
{
    if (!is_mounted) {
        return 0;
    }

    size_t total = 0, used = 0;
    if (esp_spiffs_info("storage", &total, &used) == ESP_OK) {
        return total;
    }
    return 0;
}

uint32_t flash_spiffs_get_used_size(void)
{
    if (!is_mounted) {
        return 0;
    }

    size_t total = 0, used = 0;
    if (esp_spiffs_info("storage", &total, &used) == ESP_OK) {
        return used;
    }
    return 0;
}

esp_err_t flash_spiffs_format(void)
{
    if (!is_mounted) {
        ESP_LOGE(TAG, "文件系统未挂载");
        return ESP_FAIL;
    }

    ESP_LOGW(TAG, "正在格式化文件系统，所有数据将被删除...");

    // 先卸载
    esp_vfs_spiffs_unregister("storage");
    is_mounted = false;

    // 重新格式化并挂载
    esp_vfs_spiffs_conf_t conf = {
        .base_path = MOUNT_POINT,
        .partition_label = "storage",
        .max_files = 20,
        .format_if_mount_failed = true
    };

    esp_err_t ret = esp_vfs_spiffs_register(&conf);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "格式化失败: %s", esp_err_to_name(ret));
        return ret;
    }

    is_mounted = true;

    // 重新获取信息
    size_t total = 0, used = 0;
    esp_spiffs_info("storage", &total, &used);
    ESP_LOGI(TAG, "文件系统格式化完成");
    ESP_LOGI(TAG, "总空间: %u 字节", total);
    ESP_LOGI(TAG, "已用空间: %u 字节", used);

    return ESP_OK;
}

const char* flash_spiffs_get_mount_point(void)
{
    return MOUNT_POINT;
}
