#pragma once

#include "BKParseImage.h"
#include "BKFloppyImage_Prototype.h"

/*
Класс, где будут все основные методы для работы с образом.
Открытие образа, закрытие,
добавление файлов/директорий (групповое)
удаление файлов/директорий (групповое и рекурсивное)
создание директорий
извлечение файлов и преобразование форматов
*/
typedef enum
{
	ADD_ERROR_OK = 0,   //нет ошибок
	ADD_ERROR_IMAGE_NOT_OPEN, //файл образа не открыт
	ADD_ERROR_FILE_TOO_LARGE, //файл слишком большой
	ADD_ERROR_USER_CANCEL, //операция отменена пользователем
	ADD_ERROR_IMGERR,   //ошибку смотри в nImageErrorNumber
	ADD_ERROR_NUMBER
} ADDOP_ERRORS;

extern wstring g_AddOpErrorStr[];

struct ADDOP_RESULT
{
	bool bFatal;    //флаг необходимости прервать работу.
	ADDOP_ERRORS nError;    //номер ошибки в результате добавления объекта в образ
	IMAGE_ERROR_NUMS nImageErrorNumber; //номер ошибки в результате операций с образом
	AbstractFileRecord afr; //экземпляр абстрактной записи, которая вызвала ошибку.
	// Она нам нужна будет для последующей обработки ошибок
	ADDOP_RESULT()
	{
		bFatal = false;
		nError = ADD_ERROR_OK;
		nImageErrorNumber = IMAGE_ERROR_OK;
		afr.clear();
	}
};

/*
  из-за того, что как оказалось в структуре _tfinddata_t
  имя файла передаётся без пути, будем дублировать имя файла,
  но уже с путём отдельно.
*/
struct sendfiledata
{
	wstring strName;
	struct _tfinddata_t findFile;
};


class CBKListCtrl;

class CBKImage
{
		wstring         m_strStorePath;     //путь, куда будем сохранять файлы
		CBKListCtrl    *m_pListCtrl;

		PaneInfo        m_PaneInfo;
		vector<PaneInfo> m_vSelItems;

		CBKFloppyImage_Prototype *m_pFloppyImage;
		vector<CBKFloppyImage_Prototype *> m_vpImages; //тут будут храниться объекты, когда мы заходим в лог.диски

		bool m_bCheckUseBinStatus;      //состояние чекбоксов "использовать формат бин"
		bool m_bCheckLogExtractStatus;  //и "создавать лог извлечения" соответственно, проще их тут хранить, чем запрашивать сложными путями у родителя

	protected:
		void StepIntoDir(AbstractFileRecord *fr);
		bool StepUptoDir(AbstractFileRecord *fr);
		void OutCurrFilePath();

		bool ExtractObject(AbstractFileRecord *fr);
		bool ExtractFile(AbstractFileRecord *fr);
		bool DeleteRecursive(AbstractFileRecord *fr);
		bool AnalyseExportFile(AnalyseFileStruct *a);
		void SetStorePath(const wstring &str);
		bool ViewFile(AbstractFileRecord *fr);
		bool ViewFileRT11(AbstractFileRecord *fr);
		bool ViewFileAsSprite(AbstractFileRecord *fr);

	public:
		CBKImage();
		~CBKImage();
		void AttachView(CBKListCtrl *pListCtrl)
		{
			m_pListCtrl = pListCtrl;
		}

		bool Open(PARSE_RESULT &pr, bool bLogDisk = false); //открыть файл по результатам парсинга
		bool ReOpen(); //переинициализация уже открытого образа
		void Close(); //закрыть текущий файл
		UINT GetImgFormatName(IMAGE_TYPES nType = IMAGE_TYPE_UNKNOWN);
		void ClearImgVector();
		void PushCurrentImg();
		bool PopCurrentImg();

		bool ReadCurrentDir(int nCursorPos);

		inline bool GetImageOpenStatus()
		{
			return m_pFloppyImage->GetImageOpenStatus();
		}
		inline unsigned long GetBaseOffset() const
		{
			return m_pFloppyImage->GetBaseOffset();
		}
		inline unsigned long GetImgSize() const
		{
			return m_pFloppyImage->GetImgSize();
		}
		inline void SetCheckBinExtractStatus(bool bStatus = false)
		{
			m_bCheckUseBinStatus = bStatus;
		}
		inline void SetCheckLogExtractStatus(bool bStatus = false)
		{
			m_bCheckLogExtractStatus = bStatus;
		}
		void ItemProcessing(int nItem, AbstractFileRecord *fr);
		void ViewSelected(bool bViewAsText = true);
		void ExtractSelected(const wstring &strOutPath);
		void RenameRecord(AbstractFileRecord *fr);
		void DeleteSelected();

		//добавить в образ файл/директорию
		ADDOP_RESULT AddObject(struct sendfiledata &findFile, bool bExistDir = false);
		void OutFromDirObject(AbstractFileRecord *fr);
		//удалить из образа файл/директорию
		ADDOP_RESULT DeleteObject(AbstractFileRecord *fr, bool bForce = false);

};

