#pragma once

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

	// генерация комплекта по конструкторскому составу
	CaplInstance* GenerateComplectByPdf(CaplInstance *order, CaplInstance *pdf);

protected:
	// разузлование и поиск связей покупных изделий
	void Disassembly(aplExtent &parentPdfs);

	// оставляем связи, у которых edItem имеет расцеховку
	void FilterByRasc(std::vector<CString> &rascVec);		

	// пишем в лог
	bool ShowRelationsWithoutShop();

	// создаем комплект и occurence's к нему
	CaplInstance* CreateComplect(CaplInstance *order, CaplInstance *komplect, CaplInstance *pdf);

	void ParseRasc(CString& csInRasc,CString csDepotSep,CString csGrpSep,
		CStringArray* csapOutDepots,CStringArray* csapOutGrps, bool bErasePokrAndTermo);

	// формирует строку shopchain для apl_cnf_komplect_occurrence
	CString GetShopChain(std::map<CString, double> &valueByShop);

	// поиск справочников, к которым привязаны ПКИ
	void FindClassifiers();

	// подсчет количества рекурсивно вверх по составу
	double GetTotalPdfCount(CaplInstance *item);

	// поиск комплекта с обозначением заказа
	CaplInstance* FindExistingKomplect(CaplInstance *order);

	// поиск первого цеха из расцеховки изделия, если она есть
	CString GetShopFromRasc(CaplInstance *ingItem);

	// обозначение заказа
	CString GetOrderId(CaplInstance *order);

	// для существующего комплекта найдем его элементы
	void GetExistingOccurrences(	CaplInstance *komplect,
									std::map<CaplInstance*, CaplInstance*> &komplectOccurrences,
									std::map<std::pair<CaplInstance*, CaplInstance*>, CaplInstance*> &bomOccurrences);
	
protected:
	CaplAPI *m_api;	

	// связи, сгруппированные по edItem
	std::map<CaplInstance*, std::vector<CaplInstance*>> m_relationsByEd;	

	// расцеховка для деталей и не только
	std::map<CaplInstance*, CaplInstance*> m_pdfsRasc;

	// соответствие: ПКИ-справочник
	std::map<CaplInstance*, CaplInstance*> m_pkiClassifiers;

	// структура всего конструкторского состава
	std::map<CaplInstance*, std::vector<CaplInstance*>> m_allPdfs;
};
