/*
 * IconSet.java
 *
 * Created on 12. September 2003, 17:16
 */

package com.sun.star.wizards.web.data;


import java.util.Calendar;
import java.util.Hashtable;
import java.util.Map;
import java.util.Vector;

import com.sun.star.beans.PropertyValue;
import com.sun.star.container.NoSuchElementException;
import com.sun.star.container.XNameAccess;
import com.sun.star.i18n.NumberFormatIndex;
import com.sun.star.lang.Locale;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.util.DateTime;
import com.sun.star.util.XNumberFormatsSupplier;
import com.sun.star.util.XNumberFormatter;
import com.sun.star.wizards.common.*;
import com.sun.star.wizards.common.Helper.DateUtils;

/**
 * @author  rpiterman
 */


public class CGSettings    extends ConfigGroup {

    public String          soTemplateDir;
    public String          soGalleryDir;
    public String          workPath = null;

    public String          cp_WorkDir;

    public ConfigSet       cp_Exporters         = new ConfigSet(CGExporter.class);
    public ConfigSet       cp_Layouts           = new ConfigSet(CGLayout.class);
    public ConfigSet       cp_Styles            = new ConfigSet(CGStyle.class);
    public ConfigSet       cp_IconSets          = new ConfigSet(CGIconSet.class);
    public ConfigSet       cp_BackgroundImages  = new ConfigSet(CGImage.class);
    public ConfigSet       cp_SavedSessions     = new ConfigSet(CGSessionName.class);
    public ConfigSet       cp_Filters           = new ConfigSet(CGFilter.class);

    public ConfigSet       savedSessions        = new ConfigSet(CGSessionName.class);

    public CGSession       cp_DefaultSession    = new CGSession();
    public String          cp_LastSavedSession;

    private Map exportersMap = new Hashtable();
    private XMultiServiceFactory xmsf;

    String[] resources;
    public Formatter formatter;


    public static final int RESOURCE_PAGES_TEMPLATE = 0;
    public static final int RESOURCE_SLIDES_TEMPLATE = 1;
    public static final int RESOURCE_CREATED_TEMPLATE = 2;
    public static final int RESOURCE_UPDATED_TEMPLATE = 3;
    public static final int RESOURCE_SIZE_TEMPLATE = 4;

    public CGSettings(XMultiServiceFactory xmsf_, String[] resources_ , Object document) {
        xmsf = xmsf_;
        try {
            soTemplateDir = FileAccess.getOfficePath(xmsf, "Config","", "");
            soGalleryDir  = FileAccess.getOfficePath(xmsf,"Gallery","share", "");
            root = this;
            formatter = new Formatter(xmsf, document );
            resources = resources_;
        }
        catch (Exception ex) {
          ex.printStackTrace();
        }
    }


    private static final CGExporter[] EMPTY_ARRAY_1 = new CGExporter[0];

    public CGExporter[] getExporters(String mime) {
        CGExporter[] exps = (CGExporter[])exportersMap.get(mime);
        if (exps == null)
          exportersMap.put(mime,exps = createExporters(mime));
        return exps;
    }

    private CGExporter[] createExporters(String mime) {
        Object[] exporters = cp_Exporters.items();
        Vector v = new Vector();
        for (int i = 0; i<exporters.length; i++)
          if (((CGExporter)exporters[i]).supports(mime)) {
                try {
                    v.add(exporters[i]);
                }
                catch (Exception ex) {
                    ex.printStackTrace();
                }
          }
        return (CGExporter[])v.toArray(EMPTY_ARRAY_1);
    }

    /**
     * call after read.
     * @param xmsf
     * @param document the background document. used for date/number formatting.
     */
    public void configure(XMultiServiceFactory xmsf) throws Exception {
        workPath = FileAccess.connectURLs(soTemplateDir , cp_WorkDir);
        calcExportersTargetTypeNames(xmsf);
    }

    private void calcExportersTargetTypeNames(XMultiServiceFactory xmsf) throws Exception {
        Object typeDetect = xmsf.createInstance("com.sun.star.document.TypeDetection");
        XNameAccess xNameAccess = (XNameAccess)UnoRuntime.queryInterface(XNameAccess.class,typeDetect);
        for (int i = 0; i < cp_Exporters.getSize(); i++)
            calcExporterTargetTypeName(xNameAccess,(CGExporter)cp_Exporters.getElementAt(i));
    }


    private void calcExporterTargetTypeName(XNameAccess xNameAccess, CGExporter exporter)
        throws  NoSuchElementException,
                WrappedTargetException
    {
        if (!exporter.cp_TargetType.equals(""))
            exporter.targetTypeName =
                (String) Properties.getPropertyValue(
                    (PropertyValue[]) xNameAccess.getByName(exporter.cp_TargetType),
                    "UIName");

    }

    FileAccess fileAccess;

    FileAccess getFileAccess() throws Exception {
        return getFileAccess(xmsf);
    }

    FileAccess getFileAccess(XMultiServiceFactory xmsf) throws Exception {
        if (fileAccess==null)
          fileAccess = new FileAccess(xmsf);
        return fileAccess;
    }

    public class Formatter {
        private long docNullTime;
        private int dateFormat, numberFormat;
        private DateUtils dateUtils;

        public Formatter(XMultiServiceFactory xmsf, Object document ) throws Exception {
            dateUtils = new DateUtils(xmsf, document);
            dateFormat = dateUtils.getFormat( NumberFormatIndex.DATE_SYS_DMMMYYYY);
            numberFormat = dateUtils.getFormat( NumberFormatIndex.NUMBER_1000DEC2 );
        }

        public String formatCreated(DateTime date) {
            String sDate = dateUtils.format( dateFormat, date );
            return JavaTools.replaceSubString( resources[CGSettings.RESOURCE_CREATED_TEMPLATE], sDate, "%DATE" );
        }

        public String formatUpdated(DateTime date) {
            String sDate = dateUtils.format( dateFormat, date );
            return JavaTools.replaceSubString( resources[CGSettings.RESOURCE_UPDATED_TEMPLATE], sDate, "%DATE" );
        }

        public String formatFileSize(int size) {
            float sizeInKB = ((float)size) / 1024f;
            String sSize = dateUtils.getFormatter().convertNumberToString(numberFormat, sizeInKB );
            return JavaTools.replaceSubString( resources[CGSettings.RESOURCE_SIZE_TEMPLATE], sSize, "%NUMBER" );
        }

    }

}
