#pragma once

// Класс для генерации спецификации


class CSpecLine
{
public:
	CString sFormat;
	CString sZone;
	CString sPos;
	CString sId;
	CString sName;
	CString sKol;
	CString sPrim;
	CString sUnit;

	CaplInstance *pdf;
	CaplInstance *rel;

	// Выделено при разборе
	CString sStandart; // ГОСТ, ОСТ или ТУ

	
	// Поля для сортировки
	CString sIdUpper; // sId приведенное к заглавным
	CString sNameLower;
	CString sPos4Sort; // "Длинная позиция с нулями вначале"

	// Для сортировки документов
	bool bIsMainDoc; // Основной комплект 
	int  iSortNum;  // Номер для сортировки видов документов

	// Группировка
	int iGrpByName; // Группа по имени    -1, если не в группе
	int iGrpByNameSize; // кол-во элементв в группе
	int iGrpByStd;  // Группа по стандарту -1, если не в группе
	int iGrpByStdSize; // кол-во элементв в группе

	CSpecLine(){pdf=0; rel=0; bIsMainDoc=false; iSortNum=0; iGrpByName=-1; iGrpByStd=-1; iGrpByNameSize=0; iGrpByStdSize=0;}
};

typedef CaplTAggr <CSpecLine*, CSpecLine*,  /*APLAGGR_UNIQUE|*/APLAGGR_LIST|APLAGGR_AUTOKILLREF> T_LIST_CSpecLine;


class CSpecGenerator
{
public:
	CSpecGenerator(CaplAPI *api);
	~CSpecGenerator(void);

	//параметры генерации
	BOOL m_bSaveAsDocument; // Сохранить как документ. В противном слкчае бкдет просто файл (для тестирования)
	BOOL m_bSetNewVersionActive;  // Делать новую версиб активной

	BOOL m_bSetEmptyPosition; // Задавать позиции при генерации
	BOOL m_bClearExistPos; // Очистить все позиции при генерации

	BOOL m_bGetFormatForPart; // Определять форматы для деталей
	BOOL m_bSetBCHForPart; // Если нет чертежа, то ставить БЧ
	BOOL m_bBCHF_AddMat; // Если нет чертежа, то писать материал

	BOOL m_bUseSubst; // Выводить замены в контексте сборки

	BOOL m_bUseOst4; //  Выводить подборные 
	BOOL m_bUsage; // писать заим.
	BOOL m_bUseAassemblyDescr4Notes; // Писать описание сборки как примечание в конце спецификации

	// Функции
	bool Generate(CaplInstance *pdf, bool bShowOptions=false, CaplInstance *change=0, CaplInstance **new_spec_rev=0);

	bool ShowOptionsDlg(bool b4change=false);  // Показывает диалог настроек
	bool SaveOptions();
	bool LoadOptions();

protected:
	
	CaplAPI *m_api;
	CaplInstance *m_pdf; // сборка для которой генерируеся спецификация
	CaplInstance *m_change; // Изменение, для которого генерится спецификация

	CaplReportTableColumn  *m_comumn_format;
	CaplReportTableColumn  *m_comumn_zone;
	CaplReportTableColumn  *m_comumn_pos;
	CaplReportTableColumn  *m_comumn_id;
	CaplReportTableColumn  *m_comumn_name;
	CaplReportTableColumn  *m_comumn_kol;
	CaplReportTableColumn  *m_comumn_prim;

	T_LIST_CaplReportDataRow m_all_rows;

	CaplMap m_map_pdr_line;
	CaplAggrMap m_map_subst;

	CaplMap m_map_eff; //Карта применяемостей, прекращающих действие pdr

	CString m_sMainPdвIdUpper; // Обозначение сборки, для котрой генерируется спецификация

	bool GenerateSpDocs(CaplInstance *pdf, T_LIST_CaplReportDataRow &data_rows); // Раздел локументация
	bool GenerateSpParts(CaplInstance *pdf, T_LIST_CaplReportDataRow &data_rows); // Состав изделия
	bool GenerateSpNotes(CaplInstance *pdf, T_LIST_CaplReportDataRow &data_rows); // Примечание

	bool GetFormatForParts(T_LIST_CSpecLine &section_data); // Заполнение поля формат для деталей

	bool AppendEmptyLine(bool bKeepWithNext);  // Добавляет пустую строку
	bool AppendSectionHeader(LPCSTR section_name);  // Добавляет заголовок секции
	bool AppendGroupHeader(LPCSTR group_header);
	bool AppendSection(LPCSTR section_name, T_LIST_CSpecLine &section_data);
	bool AppendSectionWithGroup(LPCSTR section_name, T_LIST_CSpecLine &section_data); // Для секций с группировкой

	bool SetPosition4Section(T_LIST_CSpecLine &section_data); // раздача незаполненных позиций

	bool SetUsage4Section(T_LIST_CSpecLine &section_data); // Простановка "заим."

	// Группировка
	bool GroupElements(T_LIST_CSpecLine &section_data);

	// Функции сортировки разделов
	static int CompareDocsLine( const void *p1,const void *p2);
	static int CompareKomplexLine( const void *p1,const void *p2);
	static int CompareStandartLine( const void *p1,const void *p2);

	bool LoadSubstitutions(aplExtent &ext_pdr, aplExtent &ext_subst);  // Чтение замен
	bool PrepareSubstitutions(); // Заполнение полей данными о заменах

	// Задание позиций
	int m_max_position; // Максимальная позиция обнаруженая до генерации или заданная при генерации

	// Преобразование во множественное число
	bool LoadPlural();
	CaplStrStrMap m_plural_map; //преобразование имени во можественное
	CaplStrStrMap m_plural_supergroup_map; //преобразование имени в супергруппу
};
