package net.sourceforge.ganttproject.export;

import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File;

import javax.swing.Box;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
import javax.swing.filechooser.FileFilter;

import net.sourceforge.ganttproject.IGanttProject;
import net.sourceforge.ganttproject.document.Document;
import net.sourceforge.ganttproject.export.ExportFileWizardImpl.State;
import net.sourceforge.ganttproject.filter.ExtensionBasedFileFilter;
import net.sourceforge.ganttproject.gui.FileChooserPageBase;
import net.sourceforge.ganttproject.gui.TextFieldAndFileChooserComponent;
import net.sourceforge.ganttproject.gui.options.OptionsPageBuilder;
import net.sourceforge.ganttproject.gui.options.SpringUtilities;
import net.sourceforge.ganttproject.gui.options.model.GPOption;
import net.sourceforge.ganttproject.gui.options.model.GPOptionGroup;
import net.sourceforge.ganttproject.gui.projectwizard.WizardPage;
import net.sourceforge.ganttproject.language.GanttLanguage;

class FileChooserPage extends FileChooserPageBase {

    private State myState;

    //private TextFieldAndFileChooserComponent myChooser;

    private IGanttProject myProject;

    //private JPanel myComponent;

    //private JComponent mySecondaryOptionsComponent;
    
    //private OptionsPageBuilder myOptionsBuilder;


	private GPOptionGroup myWebPublishingGroup;
    
    FileChooserPage(State state, IGanttProject project) {
        myState = state;
        myProject = project;
        myWebPublishingGroup = new GPOptionGroup("exporter.webPublishing", new GPOption[]{state.getPublishInWebOption()});
        myWebPublishingGroup.setTitled(false);
        //myOptionsBuilder = new OptionsPageBuilder();
    }

    protected String getFileChooserTitle() {
        return GanttLanguage.getInstance().getText("selectFileToExport");
    }


    public String getTitle() {
        return GanttLanguage.getInstance().getText("selectFileToExport");
    }


    protected void onFileChosen(File file) {
        String proposedExtension = myState.getExporter()
                .proposeFileExtension();
        if(proposedExtension != null) {
	        if (false == file.getName().toLowerCase().endsWith(
	                proposedExtension)) {
	            file = new File(file.getAbsolutePath() + "."
	                    + proposedExtension);
	        }
        }
        myState.setFile(file);
    }
    
    public void setActive(boolean b) {
        if (b == false) {
            myState.setFile(getSelectedFile());
            super.setActive(b);
        } else {
        	super.setActive(b);
            File proposedFile = proposeOutputFile(myProject);
            if (proposedFile == null) {
                setSelectedFile(myState.getFile());
                return;
            }
            if (false == proposedFile.equals(getSelectedFile())) {
                setSelectedFile(proposedFile);
                myState.setFile(proposedFile);
            }
        }
    }

    public File proposeOutputFile(IGanttProject project) {
        return proposeOutputFile(project, myState.getExporter());
    }
    
    static File proposeOutputFile(IGanttProject project, Exporter exporter) {
        String proposedExtension = exporter.proposeFileExtension();
        if (proposedExtension == null) {
            return null;
        }
        File userHome = new File(System.getProperty("user.home"));
        File result = new File(userHome, project.getProjectName() + "."
                + proposedExtension);
        Document projectDocument = project.getDocument();
        if (projectDocument != null) {
            File localFile = new File(projectDocument.getFilePath());
            if (localFile.exists()) {
                String name = localFile.getAbsolutePath();
                int lastDot = name.lastIndexOf('.');
                name = name.substring(0, lastDot) + "." + proposedExtension;
                result = new File(name);
            } else {
                File directory = localFile.getParentFile();
                if (directory.exists()) {
                    result = new File(directory, project.getProjectName() + "."
                            + proposedExtension);
                }
            }
        }
        return result;
        
    }

	protected FileFilter createFileFilter() {
		return new ExtensionBasedFileFilter(
                myState.getExporter().getFileNamePattern(), myState.getExporter()
                        .getFileTypeDescription());
	}

	protected GPOptionGroup[] getOptionGroups() {
		GPOptionGroup[] exporterOptions = null;
		if (myState.getExporter()!=null) {
			exporterOptions = myState.getExporter().getSecondaryOptions();
		}
		if (exporterOptions==null) {
			return new GPOptionGroup[] {myWebPublishingGroup};			
		}
		GPOptionGroup[] result = new GPOptionGroup[exporterOptions.length+1];
		result[0] = myWebPublishingGroup;
		System.arraycopy(exporterOptions, 0, result, 1, exporterOptions.length);
		return result;
	}

}
