// import JSZip from 'jszip';
// import $, {ajax} from "jquery";
// import Dropzone from 'dropzone';
//
// interface DropzoneFileWithServerId extends Dropzone.DropzoneFile {
//     serverId?: string;
// }
//
// $(function () {
//
//
//     $(".dz-button").removeClass("dz-button").addClass("btn btn-light dz-cust");
//     $('#submitbutton').prop("disabled", true);
//
//     if (window.location.href.indexOf("/de/") > -1) {
//         $(".dz-cust").html("<i class=\"icofont-plus-circle f-22\"></i> <span style='font-size: 26px'> Dateien hochladen</span>");
//     }
//
//     if (window.location.href.indexOf("/en/") > -1) {
//         $(".dz-cust").html("<i class=\"icofont-plus-circle f-22\"></i> <span style='font-size: 26px'> Upload Files</span>");
//     }
//
//     if (window.location.href.indexOf("/es/") > -1) {
//         $(".dz-cust").html("<i class=\"icofont-plus-circle f-22\"></i> <span style='font-size: 26px'> Cargar archivos</span>");
//     }
//
//     if (window.location.href.indexOf("/ru/") > -1) {
//         $(".dz-cust").html("<i class=\"icofont-plus-circle f-22\"></i> <span style='font-size: 26px'> Загрузка файлов</span>");
//     }
//
//     $('#shared_file_contact').on('change', function() {
//         checkFormState();
//     });
//
//     $('#shared_file_title, #shared_file_message').on('input', function () {
//         checkFormState();
//     });
//
//     $('#shared_file_email').on('input', function () {
//         checkFormState();
//     });
// })
//
// const license: string = $('#aLXq676F8V6arDsukGLrsnKkdvc7Jv5TKu9F6aSWaVaVaujkmF').val() as string
//
//
// //o9zZ
// //mdzPzA==
// let maxFilesizeVal = 3000;
// let maxFilesizeValShow = Number(maxFilesizeVal / 1000) + ' GB'
// if (license == 'o9zZ') {
//     maxFilesizeVal = 200000
//     maxFilesizeValShow = Number(maxFilesizeVal / 1000) + ' GB'
// }
// $('#maxUploadSize').text(maxFilesizeValShow)
// //alert(maxFilesizeVal)
// Dropzone.options.docUpload = {
//     //autoProcessQueue: false,
//     maxFilesize: maxFilesizeVal,
//     addRemoveLinks: true,
//     dictCancelUpload: '<i class="icofont-stop icofont-2x" style="position: absolute; cursor: pointer; margin-top: -20px; margin-left: -15px; z-index: 10000"></i>',
//     dictRemoveFile: "<i class=\"d-none d-md-block icofont-delete-alt icofont-2x text-danger\" style=\"position: absolute; cursor: pointer; margin-top: -28px; margin-left: 45px;z-index: 10000\"></i><svg class='d-block d-md-none' style='position: absolute; margin-left: -26px; cursor: pointer; z-index: 10000;' width=\"20\" height=\"20\" viewBox=\"0 0 50 50\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g clip-path=\"url(#clip0_348_833)\"><line x1=\"0.707107\" y1=\"-0.707107\" x2=\"50.7071\" y2=\"49.2929\" stroke=\"currentColor\" stroke-width=\"2\"/><line x1=\"50.7071\" y1=\"0.707107\" x2=\"0.707108\" y2=\"50.7071\" stroke=\"currentColor\" stroke-width=\"2\"/></g><defs><clipPath id=\"clip0_348_833\"><rect width=\"50\" height=\"50\" fill=\"currentColor\"/></clipPath></defs></svg>",
//     init: function () {
//         this.on("success", function (file: DropzoneFileWithServerId, response: any) {
//             file.serverId = response.id;
//             $('.dz-default').show()
//             $('.dz-cust').show()
//             //$('#uploader').hide();
//             //$('#uploadData').show();
//             //$('#submitbutton').prop("disabled",false);
//             if($('#shared_file_email').val()) {
//                 const emailData: string = $('#shared_file_email').val() as string
//                 if (emailData.length > 0) {
//                 }
//             }
//             $(file.previewElement).find('.dz-success-mark').remove();
//
//             $('#submitbutton').prop("disabled", false);
//
//             $('#the-progress-div').hide();
//
//             $('#hasFile').val(1)
//             updateFileVisibility();
//             checkFormState();
//         });
//         this.on("sending", function (file, xhr, formData) {
//             $('#the-progress-div').show();
//             $('#submitbutton').prop("disabled", true);
//             //$('#uploader').show();
//             //$('#uploadData').hide();
//         });
//         this.on("totaluploadprogress", function (progress) {
//             $("#the-progress-div").width(progress.toFixed(0) + '%');
//             $(".the-progress-text").text(progress.toFixed(0) + '%');
//
//         });
//         this.on("removedfile", function (file: DropzoneFileWithServerId) {
//             const locale = window.location.pathname.split('/')[2];
//             const url = `/app/${locale}/upload/${file.serverId}/remove`;
//
//             ajax({
//                 method: 'POST',
//                 url: url,
//                 success: function (response: any) {
//                     if (response.success === true) {
//                         updateFileVisibility();
//                         checkFormState();
//                     }
//                 },
//             });
//         });
//     }
// };
//
//
// const fileContainer = $('#docUpload');
// const toggleButton = $('<button id="toggleFiles" class="toggle-files" type="button" style="display: none;">Show more</button>');
// fileContainer.after(toggleButton);
//
// function updateFileVisibility() {
//     const filePreviews = fileContainer.find('.dz-preview');
//     if (!fileContainer.hasClass('show-all')) {
//         filePreviews.each(function (index) {
//             if (index >= 3) {
//                 $(this).addClass('d-none');
//             } else {
//                 $(this).removeClass('d-none');
//             }
//         });
//     }
//
//
//     if (filePreviews.length > 3) {
//         toggleButton.show();
//         if (!fileContainer.hasClass('show-all')) {
//             toggleButton.text('Show more');
//         }
//     } else {
//         toggleButton.hide(); // Скрываем кнопку если файлов 3 или менее
//     }
// }
//
//
// const folderInput = document.getElementById('folderInput') as HTMLInputElement;
// const uploadFolderButton = document.getElementById('uploadFolderBtn') as HTMLButtonElement;
//
// // Обработчик для выбора папок
// uploadFolderButton.addEventListener('click', () => {
//     folderInput.click();
// });
//
// // Слушаем выбор файлов/папок
// folderInput.addEventListener('change', async (event: Event) => {
//     const input = event.target as HTMLInputElement;
//     if (input.files && input.files.length > 0) {
//         const files = Array.from(input.files);
//         const zip = new JSZip();
//
//         // Организация файлов в ZIP
//         const firstFile = files[0];
//         const folderName = firstFile.webkitRelativePath.split('/')[0];
//
//
//         files.forEach((file) => {
//             zip.file(file.webkitRelativePath, file);
//         });
//
//         // Генерация ZIP-архива
//         const zipBlob = await zip.generateAsync({ type: 'blob' });
//         const zipFileName = folderName ? `${folderName}.zip` : 'archive.zip';
//         const zipFile = new File([zipBlob], zipFileName, { type: 'application/zip' });
//
//         // Добавление ZIP в Dropzone
//         const dropzoneInstance = Dropzone.forElement('#docUpload');
//         dropzoneInstance.addFile(zipFile as any);    }
// });
//
// toggleButton.on('click', function () {
//     if (fileContainer.hasClass('show-all')) {
//         fileContainer.removeClass('show-all');
//         fileContainer.find('.dz-preview').each(function (index) {
//             if (index >= 3) {
//                 $(this).addClass('d-none');
//             }
//         });
//         toggleButton.text('Show more');
//     } else {
//         fileContainer.addClass('show-all');
//         fileContainer.find('.dz-preview').removeClass('d-none');
//         toggleButton.text('Hide');
//     }
// });
//
// function checkFormState() {
//     const filesUploaded = fileContainer.find('.dz-preview').length > 0;
//     const emailSelected = String($('#shared_file_email').val()).trim() !== '';
//
//     const titleFilled = String($('#shared_file_title').val()).trim() !== '';
//     const messageFilled = String($('#shared_file_message').val()).trim() !== '';
//
//     if (emailSelected && filesUploaded && titleFilled && messageFilled) {
//         $('#submitbutton').prop("disabled", false);
//         return true;
//     } else {
//         $('#submitbutton').prop("disabled", true);
//         return false;
//     }
// }

import $, {ajax} from "jquery";
import Dropzone from 'dropzone';

interface DropzoneFileWithServerId extends Dropzone.DropzoneFile {
    serverId?: string;
}

function isIgnoredSystemFile(fileName?: string | null): boolean {
    const ignoredNames = new Set([
        '.ds_store',
        'desktop.ini',
        'thumbs.db',
        'ehthumbs.db',
        'ehthumbs_vista.db',
    ]);

    return ignoredNames.has((fileName ?? '').trim().toLowerCase());
}

function getUploadFileSizeBytes(file: DropzoneFileWithServerId): number {
    return file.size || 0;
}

function isUsableUploadFilename(name?: string | null): boolean {
    const trimmed = (name ?? '').trim();
    if (trimmed === '' || trimmed === '.') {
        return false;
    }

    const base = trimmed.split(/[/\\]/).pop()?.toLowerCase() ?? '';
    return base !== 'blob' && base !== 'blob.bin';
}

function getOriginalUploadFilename(file: DropzoneFileWithServerId): string {
    const relativeName = file.webkitRelativePath?.split(/[/\\]/).pop();
    const candidates = [
        file.name,
        relativeName,
    ];

    for (const candidate of candidates) {
        if (isUsableUploadFilename(candidate)) {
            return String(candidate).split(/[/\\]/).pop() as string;
        }
    }

    return file.name || 'upload.bin';
}

const PROGRESS_CIRCUMFERENCE = 2 * Math.PI * 40;

function setUploadProgress(progress: number, statusText?: string, spinning = false): void {
    const circle = $('#upload-progress-circle');
    const ring = $('#upload-progress-ring');
    const value = $('#upload-progress-value');
    const percent = $('#upload-progress-percent');
    const status = $('#upload-progress-status');
    const clamped = Math.max(0, Math.min(100, progress));

    circle.addClass('is-active').show();
    percent.text(Math.round(clamped) + '%');
    if (statusText) {
        status.text(statusText);
    }

    if (spinning) {
        ring.removeClass('is-determinate');
    } else {
        ring.addClass('is-determinate');
        value.css('stroke-dashoffset', String(PROGRESS_CIRCUMFERENCE * (1 - clamped / 100)));
    }
}

function hideUploadProgress(): void {
    $('#upload-progress-circle').removeClass('is-active').hide();
    $('#upload-progress-percent').text('0%');
    $('#upload-progress-value').css('stroke-dashoffset', String(PROGRESS_CIRCUMFERENCE));
}

function getUploadFinishedMessage(): string {
    const source = document.getElementById('folderInput');

    return source?.dataset.uploadFinishedMessage || 'Upload completed.';
}

function showSuccessFlash(message: string): void {
    showFlashMessage('success', message);
}

function showErrorFlash(message: string): void {
    showFlashMessage('danger', message);
}

function showFlashMessage(label: 'success' | 'danger', message: string): void {
    const flashContainer = document.getElementById('flash-messages');
    if (!flashContainer) {
        console.error(message);
        return;
    }

    const flashElement = document.createElement('div');
    flashElement.className = `flash-message flash-message--${label}`;
    flashElement.innerHTML = `
        <div class="flash-message__icon">${label === 'success' ? '✓' : '×'}</div>
        <div class="flash-message__text">
            <div class="headline">${(window as any).getFlashHeadline?.(label) ?? (label === 'success' ? 'Success' : 'Error')}</div>
            <div class="subtext">${message}</div>
        </div>
        <button class="flash-message__close" aria-label="${(window as any).flashHeadlines?.close ?? 'Close'}">&times;</button>
    `;

    flashContainer.appendChild(flashElement);
    const closeBtn = flashElement.querySelector('.flash-message__close');
    closeBtn?.addEventListener('click', () => flashElement.remove());
    setTimeout(() => flashElement.remove(), 5000);
}

function suppressBrowserAlerts(): void {
    const win = window as any;
    if (win.__uploadAlertSuppressed) {
        return;
    }
    win.__uploadAlertSuppressed = true;
    win.alert = (message?: unknown) => {
        showErrorFlash(String(message ?? ''));
    };
}

$(function () {
    suppressBrowserAlerts();
    $(".dz-message").hide();
    $('#submitbutton').prop("disabled", true);

    $('#uploadFilesBtn').on('click', function () {
        const dropzoneInstance = Dropzone.forElement('#docUpload');
        // @ts-ignore
        dropzoneInstance.hiddenFileInput?.click();
    });

    $('#shared_file_email').on('input', function () {
        checkFormState();
    });

    $('#shared_file_title, #shared_file_message').on('input', function () {
        checkFormState();
    });
})

const license: string = $('#aLXq676F8V6arDsukGLrsnKkdvc7Jv5TKu9F6aSWaVaVaujkmF').val() as string

let maxFilesizeVal: number = parseInt($('#maxFilesizeMb').val() as string, 10);
let maxFilesizeValShow = Number(maxFilesizeVal / 1000) + ' GB'
$('#maxUploadSize').text(maxFilesizeValShow)

// @ts-ignore
Dropzone.options.docUpload = {
    // Конфигурация чанкинга (перенесено из платной версии)
    chunking: true,
    forceChunking: true,
    chunkSize: 52428800, // 50 MB
    parallelChunkUploads: false,
    retryChunks: true,
    retryChunksLimit: 3,

    // Другие настройки
    maxFilesize: maxFilesizeVal,
    addRemoveLinks: true,
    timeout: 300000, // 5 минут таймаут для каждого чанка

    // Параметры для правильной передачи имени файла
    paramName: "file",
    // @ts-ignore
    renameFile: function (file) {
        return file.name;
    },

    dictCancelUpload: '<i class="icofont-stop icofont-2x" style="position: absolute; cursor: pointer; margin-top: -20px; margin-left: -15px; z-index: 10000"></i>',
    dictRemoveFile: "<i class=\"d-none d-md-block icofont-delete-alt icofont-2x text-danger\" style=\"position: absolute; cursor: pointer; margin-top: -28px; margin-left: 45px;z-index: 10000\"></i><svg class='d-block d-md-none' style=' position: absolute; margin-left: -26px; cursor: pointer; z-index: 10000;' width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 6L6 18\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 6L18 18\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n",

    init: function () {
        this.on("addedfile", function (file: DropzoneFileWithServerId) {
            if (isIgnoredSystemFile(file?.name)) {
                // @ts-ignore
                this.removeFile(file);
            }
        });
        this.on("success", function (file: DropzoneFileWithServerId, response: any) {
            console.log('Upload success response:', response);

            if (response.success) {
                file.serverId = response.id;
                $('.dz-default').show();
                $('.dz-cust').show();
                $(file.previewElement).find('.dz-success-mark').remove();
                hideUploadProgress();
                updateFileVisibility();
                checkFormState();

                // Показываем сообщение о завершении для больших файлов
                if (response.completed) {
                    console.log('File upload completed:', response.file);
                }
            } else {
                console.error('Upload failed:', response.error);
                // @ts-ignore
                this.removeFile(file);
                showErrorFlash('Upload failed: ' + response.error);
            }
        });

        this.on("error", function (file: DropzoneFileWithServerId, errorMessage: any) {
            console.error('Upload error:', errorMessage);

            let message = 'Upload failed';
            if (typeof errorMessage === 'string') {
                message = errorMessage;
            } else if (errorMessage?.error === 'quota_exceeded') {
                message = errorMessage.message ?? 'Storage quota exceeded.';
            } else if (errorMessage?.error) {
                message = errorMessage.error;
            }

            showErrorFlash(message);
            // @ts-ignore
            this.removeFile(file);
        });

        this.on("sending", function (file: DropzoneFileWithServerId, xhr, formData) {
            console.log('Sending file:', file.name);
            console.log('File size:', file.size);
            console.log('File type:', file.type);

            formData.append('dzoriginalfilename', getOriginalUploadFilename(file));
            formData.append('file_size', String(getUploadFileSizeBytes(file)));

            // Проверим, что передается в formData
            console.log('FormData entries:');
            // @ts-ignore
            for (let pair of formData.entries()) {
                console.log(pair[0] + ': ' + pair[1]);
            }

            setUploadProgress(0, undefined, true);
            $('#submitbutton').prop("disabled", true);
        });

        this.on("uploadprogress", function (file, progress, bytesSent) {
            console.log('Upload progress:', progress + '%', 'Bytes sent:', bytesSent);
        });

        this.on("totaluploadprogress", function (progress) {
            setUploadProgress(progress);
        });

        this.on("removedfile", function (file: DropzoneFileWithServerId) {
            if (file.serverId) {
                const locale = window.location.pathname.split('/')[2];
                const url = `/app/${locale}/upload/${file.serverId}/remove`;
                console.log('Removing file:', file.serverId);

                ajax({
                    method: 'POST',
                    url: url,
                    success: function (response: any) {
                        if (response.success === true) {
                            updateFileVisibility();
                            checkFormState();
                        }
                    },
                    error: function (xhr, status, error) {
                        console.error('Error removing file:', error);
                    }
                });
            }
        });

        // Обработка chunked upload
        this.on("chunksUploaded", function (file: DropzoneFileWithServerId, done: Function) {
            console.log('All chunks uploaded for file:', file.name);
            // Dropzone автоматически вызовет done() когда получит успешный ответ
            done();
        });
        this.on("queuecomplete", function (this: Dropzone) {
            if (this.getQueuedFiles().length === 0 && this.getUploadingFiles().length === 0) {
                showSuccessFlash(getUploadFinishedMessage());
            }
        });
    }
};

const fileContainer = $('#docUpload');
const toggleButton = $('<button id="toggleFiles" class="toggle-files" type="button" style="display: none;">Show more</button>');
fileContainer.after(toggleButton);

function updateFileVisibility() {
    const filePreviews = fileContainer.find('.dz-preview');

    if (!fileContainer.hasClass('show-all')) {
        filePreviews.each(function (index) {
            if (index >= 3) {
                $(this).addClass('d-none');
            } else {
                $(this).removeClass('d-none');
            }
        });
    }

    if (filePreviews.length > 3) {
        toggleButton.show();
        if (!fileContainer.hasClass('show-all')) {
            toggleButton.text('Show more');
        }
    } else {
        toggleButton.hide();
    }
}

toggleButton.on('click', function () {
    if (fileContainer.hasClass('show-all')) {
        fileContainer.removeClass('show-all');
        fileContainer.find('.dz-preview').each(function (index) {
            if (index >= 3) {
                $(this).addClass('d-none');
            }
        });
        toggleButton.text('Show more');
    } else {
        fileContainer.addClass('show-all');
        fileContainer.find('.dz-preview').removeClass('d-none');
        toggleButton.text('Hide');
    }
});

const folderInput = document.getElementById('folderInput') as HTMLInputElement | null;
const uploadFolderButton = document.getElementById('uploadFolderBtn') as HTMLButtonElement | null;

uploadFolderButton?.addEventListener('click', () => {
    folderInput?.click();
});

folderInput?.addEventListener('change', async (event: Event) => {
    const input = event.target as HTMLInputElement;
    if (input.files && input.files.length > 0) {
        const files = Array.from(input.files);
        const firstFile = files[0];
        const folderName = firstFile.webkitRelativePath.split('/')[0];
        const startedAt = Date.now();

        console.log(`Queueing ${files.length} files for folder: ${folderName}`);

        try {
            setUploadProgress(0, 'Queueing files...', true);

            const dropzoneInstance = Dropzone.forElement('#docUpload');
            const batchSize = 100;
            let queuedFiles = 0;

            for (let i = 0; i < files.length; i += batchSize) {
                const batch = files.slice(i, i + batchSize);
                for (const file of batch) {
                    if ((file.size ?? 0) <= 0 || isIgnoredSystemFile(file.name)) {
                        continue;
                    }
                    dropzoneInstance.addFile(file as any);
                    queuedFiles++;
                }

                const progress = (queuedFiles / files.length) * 100;
                setUploadProgress(progress, `Queueing: ${queuedFiles}/${files.length}`);
                await new Promise((resolve) => setTimeout(resolve, 0));
            }

            console.log(`Queued ${queuedFiles} files from folder ${folderName}`);
            hideUploadProgress();
            input.value = '';

        } catch (error) {
            console.error('Error queueing folder files:', error);
            hideUploadProgress();
            let errorMessage = 'Failed to queue folder files for upload';
            if (error instanceof Error) {
                errorMessage += ': ' + error.message;
            }
            showErrorFlash(errorMessage);
            input.value = '';
        }
    }
});
function checkFormState() {
    // В бесплатной версии используем только shared_file_email
    const emailSelected = String($('#shared_file_email').val()).trim() !== '';
    const filesUploaded = fileContainer.find('.dz-preview').length > 0;
    const titleFilled = String($('#shared_file_title').val()).trim() !== '';
    const messageFilled = String($('#shared_file_message').val()).trim() !== '';

    if (filesUploaded && titleFilled && messageFilled && emailSelected) {
        $('#submitbutton').prop("disabled", false);
        return true;
    } else {
        $('#submitbutton').prop("disabled", true);
        return false;
    }
}