/*
 *  Draco Econometrics
 *  Copyright (C) 2006-2007 Approximatrix, LLC
 *  http://www.approximatrix.com
 *  
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.approximatrix.draco.io;

import javax.swing.JFrame;


import com.approximatrix.draco.main.ui.MainWindow;
import com.approximatrix.draco.datamodel.StatTableModel;
import com.approximatrix.draco.io.XMLio.LoadWorksheet;
import com.approximatrix.draco.io.ui.IOFileWorkerDialog;
import com.approximatrix.draco.io.ui.IOWorker;

public class LoadODS implements IOWorker {

	private static final String LOAD_WORKSHEET_TITLE = "Loading ODS File...";
	private static final String[] LOAD_STEPS = {"Accessing OpenDocument File",
												"Loading into Memory",
												"Parsing and Loading Data"};
	private static final int TOTAL_STEPS = 3;
	
	private int current_step = 0;
	private String filename = null;
	private MainWindow parent = null;
	
	private LoadWorksheet lw = null;
	private boolean success = true;
	
	private String worksheet = null;
	private int header_row = 0;
	private int start_row = 1;
	private int end_row = 0;
	private String columns = null;
	
	public LoadODS(String filename, 
			       MainWindow parent, 
			       String table, 
			       int header_row, 
			       String columns, 
			       int start_row, 
			       int end_row) {
		
		this.filename = filename;
		current_step = 1;
		this.parent = parent;
		
		this.worksheet = table;
		this.header_row = header_row-1; // Row indexing starts at 0 in native format, 1 in ODS spreadsheets
		this.start_row = start_row-1;
		this.end_row = Math.max(end_row-1,0);
	}
	
	public void load() {
		new IOFileWorkerDialog(this).setVisible(true);
	}
	
	public String getWorkerTitle() {
		return LOAD_WORKSHEET_TITLE;
	}

	public StatTableModel getLoadedData() {
		if(lw != null)
			return lw.getLoadedModel();
		else
			return null;
	}
	
	public void doStep() {
		boolean loaded = true;

		switch(current_step) {
			case 1:
				lw = new LoadWorksheet(filename,parent);
				success = (lw != null);
				break;
			case 2:
				success = lw.openIntoMemory();
				break;
			case 3:
				if(success)
					success = lw.load(worksheet,header_row,start_row,end_row);
				break;
			default:
				success = false;
		}
		current_step++;
	}

	public int getStepNumber() {
		return current_step;
	}

	public int getTotalSteps() {
		return TOTAL_STEPS;
	}

	public String getStatus() {
		return LOAD_STEPS[current_step-1];
	}

	public JFrame getParentWindow() {
		return parent;
	}

	public boolean stepSuccess() {
		return success;
	}
	
	public String getError() {
		if(lw != null) 
			return lw.getError();
		else
			return null;
	}

}
