#include <all_far.h>


#include "Int.h"

struct DeleteData
{
	BOOL        DeleteAllFolders;
	BOOL        SkipAll;
	int         OpMode;
	int         ShowHosts;
	Connection *hConnect;
};

BOOL idDeleteCB(PluginPanelItem* p,LPVOID dt)
{
	PROC(("idDeleteCB", "%p,%p [%s]", p, dt, FTP_FILENAME(p)));
	int      rres;
	FTPHost* h       = FTPHost::Convert(p);
	char    *CurName = FTP_FILENAME(p);
	char    *m;

	if(((DeleteData*)dt)->ShowHosts && !h)
		return TRUE;

//Ask
	if(IS_FLAG(p->FindData.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY))
	{
		if(!((DeleteData*)dt)->DeleteAllFolders &&
		        IS_SILENT(((DeleteData*)dt)->OpMode))
		{
			LPCSTR MsgItems[]=
			{
				((DeleteData*)dt)->ShowHosts ? FP_GetMsg(MDeleteHostsTitle):FP_GetMsg(MDeleteTitle),
				((DeleteData*)dt)->ShowHosts ? FP_GetMsg(MDeleteHostFolder):FP_GetMsg(MDeleteFolder),
				CurName,
				FP_GetMsg(MDeleteGroupDelete), FP_GetMsg(MDeleteGroupAll), FP_GetMsg(MDeleteGroupCancel)
			};
			rres = FMessage(FMSG_WARNING|FMSG_DOWN, NULL,
			                MsgItems, ARRAYSIZE(MsgItems),
			                3);

			switch(rres)
			{
					/*ESC*/
				case -1:
					return FALSE;
					/*Del*/
				case  0:
					break;
					/*DelAll*/
				case  1:
					((DeleteData*)dt)->DeleteAllFolders = TRUE;
					break;
					/*Cancel*/
				case  2:
					return FALSE;
			}
		}
	}

//Display
	SaveConsoleTitle::Text(CurName);
	FtpConnectMessage(((DeleteData*)dt)->hConnect, MDeleteTitle, PointToName(CurName));

//===============================
//Hosts
	if(((DeleteData*)dt)->ShowHosts) {
		RegWipeScope reg_wipe_scope;
		return FP_DeleteRegKeyAll(h->RegKey);
	}

//===============================
//FTP
	m = strrchr(CurName,'/');

	if(m) CurName = m+1;

	if(IS_FLAG(p->FindData.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY))
	{
//FTP directory
		//Succ delete
		if(FtpRemoveDirectory(((DeleteData*)dt)->hConnect, CurName))
		{
			if(Opt.UpdateDescriptions) p->Flags |= PPIF_PROCESSDESCR;

			return TRUE;
		}
	}
	else
	{
//FTP file
		//Succ delete
		if(FtpDeleteFile(((DeleteData*)dt)->hConnect,CurName))
		{
			if(Opt.UpdateDescriptions) p->Flags |= PPIF_PROCESSDESCR;

			return TRUE;
		}
	}

//Error
	Log(("Del error: %s", ((DeleteData*)dt)->SkipAll ? "SkipAll" : "Ask"));

	if(((DeleteData*)dt)->SkipAll == FALSE)
	{
		rres = FtpConnectMessage(((DeleteData*)dt)->hConnect, MCannotDelete, CurName, -MCopySkip, MCopySkipAll);

		switch(rres)
		{
			/*skip*/     case 0:
				Log(("Skip"));
				return TRUE;
				/*skip all*/
			case 1:
				((DeleteData*)dt)->SkipAll = TRUE;
				Log(("SkipAll"));
				return TRUE;
			default:
				Log(("Other"));
				WINPORT(SetLastError)(ERROR_CANCELLED);
				return FALSE;
		}
	}
	else
		return TRUE;
}

//---------------------------------------------------------------------------------
int FTP::DeleteFilesINT(struct PluginPanelItem *PanelItem,int ItemsNumber,int OpMode)
{
	PROC(("DeleteFilesINT", NULL))

	if(!hConnect && !ShowHosts) return FALSE;

	if(ItemsNumber == 0)       return FALSE;

	//Ask
	if(!IS_SILENT(OpMode))
	{
		LPCSTR MsgItems[]=
		{
			FMSG(ShowHosts ? MDeleteHostsTitle : MDeleteTitle),
			FMSG(ShowHosts ? MDeleteHosts      : MDeleteFiles),
			FMSG(MDeleteDelete),
			FMSG(MDeleteCancel)
		};
		int rres = FMessage(0, NULL, MsgItems, ARRAYSIZE(MsgItems), 2);

		if(rres != 0) return TRUE;

		if(ItemsNumber > 1)
		{
			String Msg;
			Msg.printf(ShowHosts ? FP_GetMsg(MDeleteNumberOfHosts) : FP_GetMsg(MDeleteNumberOfFiles) ,
			           ItemsNumber);
			MsgItems[1] = Msg.c_str();
			rres = FMessage(FMSG_WARNING|FMSG_DOWN,NULL,MsgItems,ARRAYSIZE(MsgItems),2);

			if(rres != 0) return TRUE;
		}
	}

	//LIST
	DeleteData data;
	data.DeleteAllFolders = FALSE;
	data.SkipAll          = FALSE;
	data.OpMode           = OpMode;
	data.ShowHosts        = ShowHosts;
	data.hConnect         = hConnect;
	return ExpandList(PanelItem, ItemsNumber, NULL, TRUE, idDeleteCB, &data);
}

//---------------------------------------------------------------------------------
int FTP::DeleteFiles(struct PluginPanelItem *PanelItem,int ItemsNumber,int OpMode)
{
	PROC(("DeleteFiles", NULL))
	FP_Screen _scr;
	int res = DeleteFilesINT(PanelItem,ItemsNumber,OpMode);

	if(res)
	{
		LongBeepEnd(TRUE);
		return TRUE;
	}

	res = WINPORT(GetLastError)();

	if(res == ERROR_CANCELLED)
		return TRUE;

	LongBeepEnd(TRUE);

	//Show FAR error
	if(ShowHosts)
		return FALSE;

	//Show self error message
	LPCSTR nm;

	if(ItemsNumber == 1)
		nm = FTP_FILENAME(&PanelItem[0]);
	else
		nm = Message("%d files/folders", ItemsNumber);

	FtpConnectMessage(hConnect, MCannotDelete, nm, -MOk);
	return TRUE;
}
