package org.atea.nlptools.macroniser.monogram.plugin;

import java.io.File;

import org.atea.nlptools.macroniser.util.FileUtil;
import org.atea.nlptools.macroniser.monogram.restorer.XmlRestorer;
import org.fuin.utils4j.Utils4J;

public class PptxPlugin implements IPlugin
{
    private final File tmpdir;
    private final XmlRestorer restorer;

    public PptxPlugin(File tmpdir)
    {
        this.tmpdir = tmpdir;
        restorer = new XmlRestorer();
    }

    public File run(PluginConfiguration configuration)
        throws Exception
    {
        // Create a temporary directory and unzip the file to it
        File unzipDir = FileUtil.createRandomDirectory(this.tmpdir);
        Utils4J.unzip(configuration.getFile(), unzipDir);
        
        // Restore each slide
        String slideDirPath = unzipDir.getCanonicalPath() + File.separator + "ppt" + File.separator + "slides";
        File slideDirectory = new File(slideDirPath);
        for (File slideIn : slideDirectory.listFiles())
        {
            if (slideIn.isDirectory())
            {
                continue;
            }

            File slideOut = new File(slideDirPath + File.separator + "mi-tmp-slide.xml");

            restorer.restore
            (
                slideIn,
                "utf-8",
                slideOut,
                configuration.getPreserveExistingMacrons()
            );

            //Delete the old slideX.xml and rename the restored document.
            String slideName = slideIn.getName();
            slideIn.delete();
            slideOut.renameTo(new File(slideDirPath + File.separator + slideName));
        }

        //Create a file to store the zipped file.
        File zipFile = File.createTempFile(FileUtil.TMP_FILE_PREFIX, configuration.getFileType(), tmpdir);

        //Zip the file.
        Utils4J.zipDir(unzipDir, null, zipFile);

        //Delete zip directory.
        if (unzipDir.getName().startsWith(FileUtil.TMP_FILE_PREFIX))
        {
            FileUtil.deleteFile(unzipDir);
        }
        
        return zipFile;
    }
}
