/*******************************************************************************
 * Copyright (c) 2010 Angelo Zerr and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Angelo Zerr <angelo.zerr@gmail.com> - Initial API and implementation 
 *******************************************************************************/
package org.eclipse.jst.server.jetty.core.internal.config;

import java.io.BufferedReader;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.server.core.internal.ProgressUtil;
import org.eclipse.jst.server.jetty.core.internal.JettyConstants;
import org.eclipse.jst.server.jetty.core.internal.util.IOUtils;

public class StartIni implements JettyConstants
{

    private List<PathFileConfig> jettyXMLFiles = new ArrayList<PathFileConfig>();
    private List<PathFileConfig> otherConfigs = new ArrayList<PathFileConfig>();
    private PathFileConfig startConfig = null;
    private PathFileConfig webdefaultXMLConfig = null;
    private File startIniFile;

    private boolean isStartIniDirty;

    public StartIni(IPath baseDirPath)
    {
        loadStartIni(baseDirPath,null);
        loadOtherConfigs(baseDirPath);
    }

    public StartIni(IFolder baseDirFolder)
    {
        loadStartIni(null,baseDirFolder);
        // loadOtherConfigs(null, baseDirFolder);
    }

    private List<String> loadStartIni(IPath baseDirPath, IFolder baseDirFolder)
    {
        List<String> args = new ArrayList<String>();
        if (baseDirPath != null)
        {
            IPath startIniPath = baseDirPath.append(START_INI);
            this.startIniFile = startIniPath.toFile();
        }
        else
        {
            try
            {
                this.startIniFile = IOUtils.toLocalFile(baseDirFolder.getFile(START_INI),null);
            }
            catch (CoreException e)
            {
                e.printStackTrace();
            }
        }

        if (startIniFile.exists() && startIniFile.canRead())
        {
            FileReader reader = null;
            BufferedReader buf = null;
            try
            {
                reader = new FileReader(startIniFile);
                buf = new BufferedReader(reader);

                File jettyXMLFile = null;
                String arg;
                while ((arg = buf.readLine()) != null)
                {
                    arg = arg.trim();
                    if (arg.length() == 0 || arg.startsWith("#"))
                    {
                        continue;
                    }
                    if (arg.indexOf('=') == -1)
                    {
                        if (baseDirPath != null)
                        {
                            jettyXMLFile = baseDirPath.append(arg).toFile();
                        }
                        else
                        {
                            try
                            {
                                jettyXMLFile = IOUtils.toLocalFile(baseDirFolder.getFile(arg),null);
                            }
                            catch (CoreException e)
                            {
                                e.printStackTrace();
                            }
                        }
                        if (jettyXMLFile != null && jettyXMLFile.exists() && jettyXMLFile.canRead())
                        {
                            jettyXMLFiles.add(new PathFileConfig(jettyXMLFile,new Path(arg)));
                        }
                    }
                    args.add(arg);
                }
            }
            catch (IOException e)
            {
            }
            finally
            {
                close(buf);
                close(reader);
            }
        }
        return args;
    }

    private void close(Closeable c)
    {
        if (c == null)
        {
            return;
        }
        try
        {
            c.close();
        }
        catch (IOException e)
        {
            e.printStackTrace(System.err);
        }
    }

    private void loadOtherConfigs(IPath baseDirPath)
    {
        IPath realmPropertiesPath = baseDirPath.append("etc/realm.properties");
        File realmPropertiesFile = realmPropertiesPath.toFile();
        if (realmPropertiesFile.exists())
        {
            otherConfigs.add(new PathFileConfig(realmPropertiesFile,new Path("etc/realm.properties")));
        }

        IPath webdefaultPath = baseDirPath.append("etc/webdefault.xml");
        File webdefaultFile = webdefaultPath.toFile();
        if (webdefaultFile.exists())
        {
            webdefaultXMLConfig = new PathFileConfig(webdefaultFile,new Path("etc/webdefault.xml"));
        }

        IPath startJARPath = baseDirPath.append(START_JAR);
        File startConfigFile = startJARPath.toFile();
        if (startConfigFile.exists())
        {
            startConfig = new PathFileConfig(startConfigFile,new Path(START_JAR));
        }
    }

    public List<PathFileConfig> getJettyXMLFiles()
    {
        return jettyXMLFiles;
    }

    public PathFileConfig getWebdefaultXMLConfig()
    {
        return webdefaultXMLConfig;
    }

    /**
     * Saves the Web app document.
     * 
     * @param path
     *            a path
     * @param forceDirty
     *            true to force a save
     * @throws IOException
     *             if anything goes wrong
     */
    // public void save(String path, boolean forceDirty) throws IOException {
    // if (forceDirty || isWebAppDirty)
    // //XMLUtil.save(path, webAppDocument);
    // }

    /**
     * Saves the Web app document.
     * 
     * @param file
     *            a file
     * @param monitor
     *            a progress monitor
     * @throws Exception
     *             if anything goes wrong
     */
    public void save(IFile file, IProgressMonitor monitor) throws Exception
    {
        if (file.exists() && !isStartIniDirty)
            return;
        if (startIniFile == null || !(startIniFile.exists() && startIniFile.canRead()))
            return;

        InputStream in = null;
        try
        {
            in = new FileInputStream(startIniFile);
            if (file.exists())
                file.setContents(in,true,true,ProgressUtil.getSubMonitorFor(monitor,200));
            else
                file.create(in,true,ProgressUtil.getSubMonitorFor(monitor,200));
        }
        catch (Exception e)
        {
            // ignore
        }
        finally
        {
            try
            {
                in.close();
            }
            catch (Exception e)
            {
                // ignore
            }
        }
        isStartIniDirty = false;
    }

    public List<PathFileConfig> getOtherConfigs()
    {
        return otherConfigs;
    }

    public PathFileConfig getStartConfig()
    {
        return startConfig;
    }
}
