	/****************/
	/* files-io.cpp */
	/****************/

#ifdef __GNUG__
#pragma implementation
#endif

#include "fctsys.h"
#include <wx/fs_zip.h>
#include <wx/docview.h>
#include <wx/wfstream.h>
#include <wx/zstream.h>

#include "common.h"

#include "bitmaps.h"
#include "protos.h"

#include "id.h"

#include "kicad.h"
#include "prjconfig.h"

#define ZIP_EXT wxT(".zip")
#define ZIP_MASK wxT("*.zip")

static void Create_NewPrj_Config( const wxString PrjFullFileName);

/***********************************************************/
void WinEDA_MainFrame::Process_Files(wxCommandEvent& event)
/***********************************************************/
/* Gestion generale  des commandes de sauvegarde
*/
{
int id = event.GetId();
wxString path = wxGetCwd();
wxString fullfilename;
bool IsNew = FALSE;
	
	switch (id)
		{
		case ID_SAVE_PROJECT: /* Update project File */
			Save_Prj_Config();
 			break;

		case ID_LOAD_FILE_1:
		case ID_LOAD_FILE_2:
		case ID_LOAD_FILE_3:
		case ID_LOAD_FILE_4:
		case ID_LOAD_FILE_5:
		case ID_LOAD_FILE_6:
		case ID_LOAD_FILE_7:
		case ID_LOAD_FILE_8:
		case ID_LOAD_FILE_9:
		case ID_LOAD_FILE_10:
			m_PrjFileName = GetLastProject( id - ID_LOAD_FILE_1);
			SetLastProject(m_PrjFileName);
			ReCreateMenuBar();
			Load_Prj_Config();
			break;

		case ID_NEW_PROJECT:
			IsNew = TRUE;
		case ID_LOAD_PROJECT:
			SetLastProject(m_PrjFileName);
			fullfilename = EDA_FileSelector( IsNew ? _("Create Project files:") : _("Load Project files:"),
					path,		  		/* Chemin par defaut */
					wxEmptyString,					/* nom fichier par defaut */
					g_Prj_Config_Filename_ext,	/* extension par defaut */
					wxT("*") + g_Prj_Config_Filename_ext, /* Masque d'affichage */
					this,
					IsNew ? wxSAVE : wxOPEN,
					FALSE
					);
			if ( fullfilename.IsEmpty() ) break;
				
			ChangeFileNameExt(fullfilename, g_Prj_Config_Filename_ext);
			m_PrjFileName = fullfilename;
			if ( IsNew ) Create_NewPrj_Config( m_PrjFileName);
			SetLastProject(m_PrjFileName);
			Load_Prj_Config();
			break;


		case ID_SAVE_AND_ZIP_FILES:
			CreateZipArchive(wxEmptyString);
			break;
			
		case ID_READ_ZIP_ARCHIVE:
			UnZipArchive(wxEmptyString);
			break;
		
        default: DisplayError(this, wxT("WinEDA_MainFrame::Process_Files error"));
			break;
		}
}


/**************************************************************/
static void Create_NewPrj_Config(const wxString PrjFullFileName)
/**************************************************************/
/* Cree un nouveau fichier projet a partir du modele
*/
{
wxString msg;
	// Init default config filename
	g_Prj_Config_LocalFilename.Empty();
	g_Prj_Default_Config_FullFilename =
				ReturnKicadDatasPath() +
				wxT("template/kicad") +
				g_Prj_Config_Filename_ext;

	if ( ! wxFileExists(g_Prj_Default_Config_FullFilename) )
	{
		msg = _("Template file non found ") + g_Prj_Default_Config_FullFilename;
		DisplayInfo(NULL, msg);
	}
	
	else
	{
		if ( wxFileExists(PrjFullFileName) )
		{
			msg = _("File ") + PrjFullFileName
				+ _(" exists! OK to continue?");
			if ( IsOK(NULL, msg) )
			{
			wxCopyFile(g_Prj_Default_Config_FullFilename,
							PrjFullFileName);
			}
		}
	}

	g_SchematicRootFileName = wxFileNameFromPath(PrjFullFileName);
	ChangeFileNameExt(g_SchematicRootFileName, g_SchExtBuffer);
	g_BoardFileName = wxFileNameFromPath(PrjFullFileName);
	ChangeFileNameExt(g_BoardFileName, g_BoardExtBuffer);
	
	EDA_Appl->WriteProjectConfig(PrjFullFileName, wxT("/general"), CfgParamList);
}


/**********************************************************************/
void WinEDA_MainFrame::UnZipArchive(const wxString FullFileName)
/**********************************************************************/
/* Lit un fichier archive .zip et le decompresse dans le repertoire courant
*/
{
wxString filename = FullFileName;
wxString msg;
wxString old_cwd = wxGetCwd();
	
	if ( filename.IsEmpty() )
		filename = EDA_FileSelector( _("Unzip Project:"),
					wxEmptyString,		  		/* Chemin par defaut */
					wxEmptyString,				/* nom fichier par defaut */
					ZIP_EXT,		/* extension par defaut */
					ZIP_MASK,		/* Masque d'affichage */
					this,
					wxOPEN,
					TRUE
					);
	if ( filename.IsEmpty() ) return;

	msg = _("\nOpen ") + filename + wxT("\n");
	PrintMsg( msg );

wxString target_dirname = wxDirSelector ( _("Target Directory"),
				wxEmptyString, 0, wxDefaultPosition, this);
	if ( target_dirname.IsEmpty() ) return;
		
	wxSetWorkingDirectory(target_dirname);
	msg = _("Unzip in ") + target_dirname + wxT("\n");
	PrintMsg( msg );
	
wxFileSystem zipfilesys;
	zipfilesys.AddHandler(new wxZipFSHandler);
	filename += wxT("#zip:");
	zipfilesys.ChangePathTo(filename);
	
wxFSFile * zipfile = NULL;
wxString localfilename	= zipfilesys.FindFirst( wxT("*.*") );
	
	while ( !localfilename.IsEmpty() )
	{
		zipfile = zipfilesys.OpenFile(localfilename);
		if (zipfile == NULL)
		{
			DisplayError(this, wxT("Zip file read error"));
			break;
		}
		wxString unzipfilename = localfilename.AfterLast(':');
		msg = _("Extract file ") + unzipfilename;
		PrintMsg(msg);
		wxInputStream * stream = zipfile->GetStream();
		wxFFileOutputStream * ofile = new wxFFileOutputStream(unzipfilename);
		if ( ofile->Ok() )
		{
			ofile->Write(*stream);
			PrintMsg( _(" OK\n") );
		}
		else PrintMsg( _(" *ERROR*\n") );

		delete ofile;	
		delete zipfile;
		localfilename = zipfilesys.FindNext();
	}
	PrintMsg( wxT("** end **\n") );
	
	wxSetWorkingDirectory(old_cwd);
}

/********************************************************************/
void WinEDA_MainFrame::CreateZipArchive(const wxString FullFileName)
/********************************************************************/
{
wxString filename = FullFileName;
wxString zip_file_fullname;
wxString msg;
wxString curr_path = wxGetCwd();
	
	if ( filename.IsEmpty() )
	{
		filename = m_PrjFileName;
		ChangeFileNameExt(filename, wxT(".zip"));
		filename = EDA_FileSelector( _("Archive Project files:"),
					wxEmptyString, 		/* Chemin par defaut */
					filename,		/* nom fichier par defaut */
					ZIP_EXT,		/* extension par defaut */
					ZIP_MASK,		/* Masque d'affichage */
					this,
					wxSAVE,
					FALSE
					);
	}
	if ( filename.IsEmpty() ) return;


wxFileName zip_name(filename);
	zip_file_fullname = zip_name.GetFullName();
	AddDelimiterString( zip_file_fullname );

wxChar * Ext_to_arch[] = {    /* Liste des extensions des fichiers à sauver */
	wxT("*.sch"), wxT("*.lib"), wxT("*.cmp"), wxT("*.brd"),
	wxT("*.net"), wxT("*.pro"), wxT("*.pho"),
	NULL};
int ii = 0;
wxString zip_cmd = wxT("-O ") + zip_file_fullname;
	filename = wxFindFirstFile(Ext_to_arch[ii]);
	while ( !filename.IsEmpty() )
	{
	wxFileName name(filename);
	wxString fullname = name.GetFullName();
		AddDelimiterString( fullname );
		zip_cmd += wxT(" ") + fullname;
		msg = _("Compress file ") + fullname + wxT("\n");
		PrintMsg(msg);

		filename = wxFindNextFile();
		while (filename.IsEmpty() )
		{
			ii++;
			if (Ext_to_arch[ii]) filename = wxFindFirstFile(Ext_to_arch[ii]);
			else break;
		}			
	}

#ifdef __WINDOWS__
#define ZIPPER wxT("minizip.exe")
#else
#define ZIPPER wxT("minizip")
#endif	
	if ( ExecuteFile(this, ZIPPER, zip_cmd) >= 0 )
	{
		msg = _("\nCreate Zip Archive ") + zip_file_fullname;
		PrintMsg( msg );
		PrintMsg( wxT("\n** end **\n") );
	}
	else PrintMsg( wxT("Minizip command error, abort\n") );
	
	wxSetWorkingDirectory(curr_path);
}
