/*
 * (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Contributors:
 * Nuxeo - initial API and implementation
 *
 */

package org.nuxeo.ecm.webapp.clipboard;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.zip.ZipFile;

import javax.inject.Inject;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.core.api.Blob;
import org.nuxeo.ecm.core.api.Blobs;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.impl.DocumentModelImpl;
import org.nuxeo.ecm.core.test.CoreFeature;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;

@RunWith(FeaturesRunner.class)
@Features(CoreFeature.class)
public class ZipUtilsTest {

    @Inject
    protected CoreSession session;

    protected DocumentModel createTestFolder() {
        DocumentModel parent = session.createDocumentModel("/", "parent", "Folder");
        parent.setPropertyValue("dc:title", "Parent");
        parent = session.createDocument(parent);

        DocumentModel file = session.createDocumentModel("/parent", "éèà", "File");
        file.setPropertyValue("dc:title", "éèà");

        Blob blob = Blobs.createBlob("ééà");
        blob.setFilename("éèà");
        file.setPropertyValue("file:content", (Serializable) blob);
        file.setPropertyValue("dc:title", "éèà");
        file = session.createDocument(file);
        return parent;
    }

    protected DocumentModel createHeavyFile() {
        DocumentModel heavyFile = session.createDocumentModel("/", "heavyFile", "File");
        heavyFile.setPropertyValue("dc:title", "Heavy File");

        Blob blob1 = Blobs.createBlob("abc");
        blob1.setFilename("blob1.raw");
        heavyFile.setPropertyValue("file:content", (Serializable) blob1);

        Blob blob2 = Blobs.createBlob("123");
        blob2.setFilename("blob2.raw");

        HashMap<String, Serializable> blob = new HashMap<String, Serializable>();
        blob.put("file", (Serializable) blob2);

        ArrayList<HashMap<String, Serializable>> blobs = new ArrayList<HashMap<String, Serializable>>();
        blobs.add(blob);

        heavyFile.setPropertyValue("files:files", blobs);
        heavyFile = session.createDocument(heavyFile);

        return heavyFile;
    }

    @Test
    public void testExportSimpleFile() throws Exception {
        DocumentModel folder = createTestFolder();
        List<DocumentModel> documents = new ArrayList<DocumentModel>();
        documents.add(folder);

        DocumentListZipExporter zipExporter = new DocumentListZipExporter();
        Blob blob = zipExporter.exportWorklistAsZip(documents, session, true);
        assertNotNull(blob);
        try (ZipFile zipFile = new ZipFile(blob.getFile())) {
            assertNotNull(zipFile.getEntry("Parent/éèà"));
            Framework.getProperties().setProperty(DocumentListZipExporter.ZIP_ENTRY_ENCODING_PROPERTY,
                    DocumentListZipExporter.ZIP_ENTRY_ENCODING_OPTIONS.ascii.name());
            blob = zipExporter.exportWorklistAsZip(documents, session, true);
            assertNotNull(blob);
        }
        try (ZipFile zipFile = new ZipFile(blob.getFile())) {
            assertNotNull(zipFile.getEntry("Parent/eea"));
        }
    }

    @Test
    public void testExportAllBlobs() throws Exception {
        DocumentModel heavyFile = createHeavyFile();
        List<DocumentModel> documents = new ArrayList<DocumentModel>();
        documents.add(heavyFile);

        DocumentListZipExporter zipExporter = new DocumentListZipExporter();
        Blob blob = zipExporter.exportWorklistAsZip(documents, session, true);
        assertNotNull(blob);
        try (ZipFile zipFile = new ZipFile(blob.getFile())) {
            assertNotNull(zipFile.getEntry("blob2.raw"));
            assertNotNull(zipFile.getEntry("blob1.raw"));
        }
    }

    @Test
    public void testFormatFilename() {
        DocumentListZipExporter zipExporter = new DocumentListZipExporter();
        assertEquals("test1.doc", zipExporter.formatFileName("test.doc", "1"));

        // check filename without extension
        assertEquals("test1", zipExporter.formatFileName("test", "1"));
    }
}
