#include <fstream>
#include <string>
#include "miniz/miniz.h"
#include "zipdata.h"

// xxd -i yourfile.zip > zipdata.h

// Write embedded ZIP data to a temporary file
std::string writeTempZipFile() {
    char tempPath[MAX_PATH];
    GetTempPathA(MAX_PATH, tempPath);
    std::string tempZipPath = std::string(tempPath) + "\\mEditorData.zip";

    std::ofstream outFile(tempZipPath, std::ios::binary);
    if (!outFile) {
        std::cerr << "Failed to create temporary file!" << std::endl;
        return "";
    }

    outFile.write(reinterpret_cast<char*>(data_zip), data_zip_len);
    outFile.close();

    std::cout << "Temporary ZIP file created: " << tempZipPath << std::endl;
    return tempZipPath;
}

// Extract the ZIP file using miniz
bool extractZipFile(const std::string& zipPath, const std::string& outputDir) {
    mz_zip_archive zipArchive;
    memset(&zipArchive, 0, sizeof(zipArchive));

    if (!mz_zip_reader_init_file(&zipArchive, zipPath.c_str(), 0)) {
        std::cerr << "Failed to open ZIP file: " << zipPath << std::endl;
        return false;
    }

    // Set the password for decryption
    //mz_zip_reader_set_password(&zipArchive, "654321");
    
    int numFiles = mz_zip_reader_get_num_files(&zipArchive);
    for (int i = 0; i < numFiles; i++)
    {
        mz_zip_archive_file_stat fileStat;
        if (!mz_zip_reader_file_stat(&zipArchive, i, &fileStat)) {
            std::cerr << "Failed to read file info at index " << i << std::endl;
            continue;
        }

        std::string outputFilePath = outputDir + "\\" + fileStat.m_filename;
        if (mz_zip_reader_is_file_a_directory(&zipArchive, i))
        {
            //std::string dirPath = outputFilePath.substr(0, outputFilePath.find_last_of("\\"));
            CreateDirectoryA(outputFilePath.c_str(), NULL);
            continue;
        }

        if (!mz_zip_reader_extract_to_file(&zipArchive, i, outputFilePath.c_str(), 0)) {
            std::cerr << "Failed to extract file: " << fileStat.m_filename << std::endl;
            continue;
        }

        std::cout << "Extracted: " << fileStat.m_filename << std::endl;
    }

    mz_zip_reader_end(&zipArchive);
    return true;
}
除额外注明的地方外,本维基上的内容按下列许可协议发布: CC Attribution-Share Alike 4.0 International