/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 * 
 *************************************************************/



package graphical;

import java.util.ArrayList;

/**
 *
 * @author ll93751
 */
public class Office implements IOffice
{
    private ParameterHelper m_aParameterHelper;
    private String m_sDocumentName;
    private String m_sResult;
    private IOffice m_aOffice = null;
    
    public Office(ParameterHelper _aParam, String _sResult)
    {
        m_aParameterHelper = _aParam;
        m_sResult = _sResult;

        if (_aParam.getReferenceType().toLowerCase().equals("ooo") ||
            _aParam.getReferenceType().toLowerCase().equals("o3") ||
            _aParam.getReferenceType().toLowerCase().equals("ps") ||
            _aParam.getReferenceType().toLowerCase().equals("pdf"))
        {
            m_aOffice = new OpenOfficePostscriptCreator(_aParam, m_sResult);
        }
        else if (_aParam.getReferenceType().toLowerCase().equals("msoffice"))
        {
            m_aOffice = new MSOfficePostscriptCreator(_aParam, m_sResult);
        }
    }


    /**
     * Load a document with an already started Office.
     * @param _sDocumentName
     * @throws graphical.OfficeException
     */
    public void load(String _sDocumentName) throws OfficeException
    {
        m_sDocumentName = _sDocumentName;
        // check if given file is a picture, then do nothing
        String sDocumentSuffix = FileHelper.getSuffix(m_sDocumentName);
        if (sDocumentSuffix.toLowerCase().endsWith(".png") ||
            sDocumentSuffix.toLowerCase().endsWith(".gif") ||
            sDocumentSuffix.toLowerCase().endsWith(".jpg") ||
            sDocumentSuffix.toLowerCase().endsWith(".bmp"))
        {
            throw new OfficeException("The given document is not a document type.");
        }            
        
        // TODO: we should start the office after we know if we really need an Office.
        if (m_aOffice != null)
        {
            if (sDocumentSuffix.toLowerCase().endsWith(".odb"))
            {
                if (m_aParameterHelper.getReferenceType().toLowerCase().equals("msoffice"))
                {
                    // we can't handle .odb with msoffice
                    return;
                }
                // TODO: run through all documents which exists as reports in odb files
                OpenOfficeDatabaseReportExtractor aExtractor = new OpenOfficeDatabaseReportExtractor(m_aParameterHelper);
                ArrayList aList = aExtractor.load(m_sDocumentName);
                if (aList != null)
                {
                    // remove the whole section about the 'name'.odb there are no information we need
                    // we will create a new one.
                    String sIniFile = FileHelper.appendPath(m_sResult, "index.ini");
                    IniFile aIniFile2 = new IniFile(sIniFile);
                    String sSection = FileHelper.getBasename(_sDocumentName); // name of the odb file
                    aIniFile2.removeSection(sSection);
                    aIniFile2.close();

                    for (int i=0; i<aList.size();i++)
                    {
                        String sDocumentName = (String)aList.get(i);
                        m_aOffice.load(sDocumentName);
                        m_aOffice.storeAsPostscript();
                        

                        // foreach Report found in the .odb file, create an entry 'report'<number> in the original <name>.odb Section
                        // so it is possible to run through all reports by the given .odb name
                        IniFile aIniFile = new IniFile(sIniFile);
                        // String sSection = FileHelper.getBasename(_sDocumentName); // name of the odb file
                        int nFileCount = aIniFile.getIntValue(sSection, "reportcount", 0);
                        String sValue = FileHelper.getBasename(sDocumentName);    // name of the corresponding report
                        aIniFile.insertValue(sSection, "report" + nFileCount, sValue);
                        aIniFile.insertValue(sSection, "reportcount", nFileCount + 1);
                        aIniFile.close();
                    }
                }
                else
                {
                    throw new OfficeException("Can't open the document " + m_sDocumentName);
                }
            }
            else
            {
                m_aOffice.load(_sDocumentName);
            }
        }
    }

    public void storeAsPostscript() throws OfficeException
    {
        if (m_aOffice != null)
        {
            if (m_sDocumentName.endsWith(".odb"))
            {
                // this has already be done by load() for odb files.
            }
            else
            {
                m_aOffice.storeAsPostscript();
            }

//          FileHelper.addBasenameToIndex(sOutputFilename);
        }
    }

    public void start() throws OfficeException
    {
        if (m_aOffice != null)
        {
            m_aOffice.start();
        }
    }

    public void close() throws OfficeException
    {
        if (m_aOffice != null)
        {
            m_aOffice.close();
        }
    }




}
