<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Folder Compression Tool</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.0/jszip.min.js"></script>
</head>
<body>
    <h1>Folder Compression Tool</h1>
    <input type="file" id="folderInput" webkitdirectory directory multiple>
    <button onclick="compressFolder()">Compress Folder</button>
    
    <!-- Hidden download button -->
    <button id="downloadBtn" style="display:none;" onclick="downloadFinalZip()">Download Compressed Files</button>
    
    <div id="output"></div>

    <script>
        let finalZipBlob;
        let zipFilename;
        const maxChunkSize = 9000 * 1024; // 9000 KB
        let compressedFilesLog = [];
        let exceedList = [];

        // Function to load existing logs for resuming
        function loadLogs() {
            const logs = { compressed: [], exceeded: [] };
            // Load 'compressed_files_log.txt' if it exists (mock function for demo)
            const compressedLog = localStorage.getItem('compressed_files_log');
            if (compressedLog) {
                logs.compressed = compressedLog.split('\n');
            }
            // Load 'the_selected_folder_name_exceed_size.txt' if it exists (mock function for demo)
            const exceededLog = localStorage.getItem('exceed_size_log');
            if (exceededLog) {
                logs.exceeded = exceededLog.split('\n');
            }
            return logs;
        }

        async function compressFolder() {
            const folderInput = document.getElementById('folderInput');
            const files = folderInput.files;
            if (files.length === 0) {
                alert('Please select a folder.');
                return;
            }

            const zip = new JSZip();
            const folderName = files[0].webkitRelativePath.split('/')[0];

            // Load previous logs to skip files
            const logs = loadLogs();
            compressedFilesLog = logs.compressed;
            exceedList = logs.exceeded;

            // Add files to zip, skipping those already processed or that exceed the size limit
            for (let file of files) {
                const relativePath = file.webkitRelativePath;

                if (compressedFilesLog.includes(relativePath) || exceedList.includes(relativePath)) {
                    // Skip files already compressed or that exceed the size
                    continue;
                }

                const fileData = await file.arrayBuffer();
                const compressedSize = JSZip.compressions.DEFLATE.compress(fileData).length;

                if (compressedSize > maxChunkSize) {
                    exceedList.push(relativePath);
                    continue;
                }

                zip.file(relativePath, fileData);
                compressedFilesLog.push(relativePath);
            }

            // Save logs
            saveLogs(folderName);

            // Generate the final zip Blob
            finalZipBlob = await zip.generateAsync({ type: 'blob' });
            zipFilename = `${folderName}.zip`;

            // Reveal the download button
            document.getElementById('downloadBtn').style.display = 'inline';
            document.getElementById('output').textContent = "Compression complete! Click 'Download Compressed Files' to save the zip file.";
        }

        // Function to save logs
        function saveLogs(folderName) {
            // Save compressed files log (mocked with localStorage for demo)
            localStorage.setItem('compressed_files_log', compressedFilesLog.join('\n'));
            // Save exceed size log
            localStorage.setItem('exceed_size_log', exceedList.join('\n'));

            // Create a log file inside the zip for the user to download (optional)
            const zip = new JSZip();
            if (exceedList.length > 0) {
                const exceedTxt = exceedList.join('\n');
                zip.file(`${folderName}_exceed_size.txt`, exceedTxt);
            }
            if (compressedFilesLog.length > 0) {
                const compressedTxt = compressedFilesLog.join('\n');
                zip.file('compressed_files_log.txt', compressedTxt);
            }
        }

        function downloadFinalZip() {
            const link = document.createElement('a');
            link.href = URL.createObjectURL(finalZipBlob);
            link.download = zipFilename;
            link.click();
        }
    </script>
</body>
</html>
