// functions.cpp

#include "stdafx.h"
#include <apl_api.h>
#include <apl_gui.h>
#include <CommonClasses.h>
#include "resource.h"

extern HINSTANCE _hDllInst;

bool GetInstanceInfo(CaplAPI *m_api, CaplInstance *m_inst, CString &sInfo);

//***********************************************************************************

bool add_function_0_1(CaplAPI* api, aplExtent& inExtent, bool bUpdateUI,aplExtent &out_ext, int &out_cmd)
{
	if(!api || !api->m_data.IsConnected()) return false;

	if(bUpdateUI) return true; //  В главном меню включено всегда

	AfxMessageBox("add_function_0_1");

	return true;
}

//***********************************************************************************


bool add_function_0_2(CaplAPI* api, aplExtent& inExtent, bool bUpdateUI,aplExtent &out_ext, int &out_cmd)
{
	if(!api || !api->m_data.IsConnected()) return false;

	if(bUpdateUI) return true; //  В главном меню включено всегда

	AfxMessageBox("add_function_0_2");

	return true;
}

//***********************************************************************************

bool add_references(CaplAPI* m_api, aplExtent& inExtent, bool bUpdateUI, aplExtent &out_ext, int &out_cmd)
{
	if(!m_api || !m_api->m_data.IsConnected()) return false;
	if(inExtent.GetSize()<1)  return false;

	CaplInstance *inst=inExtent[0];  // Главный объект для которого запущен пунк меню

	if(0==inst)  return false;
	if(inst->IsDeleted())  return false;
	if(inst->GetAccessmode()>aplRO)  return false;

	if(bUpdateUI)
	{
		// Здесь обработчик доступности меню.  Возвращает true - пункт доступен.   Возвращает false - пункт недоступен.

		if(m_api->m_data.IsKindOf(inst,m_api->m_prd_mgr.e_pdf)) 
		{
			if(inst->GetAccessmode()<=aplRW)  return true;
		}

		return false; // В остальных случаях пункт серый
	}


	// А здесь сама обработка при выборе пункта меню

	if(m_api->m_data.IsKindOf(inst,m_api->m_prd_mgr.e_pdf)) 
	{
		if(inst->GetAccessmode()>aplRW)  {AfxMessageBox("Нет прав доступа!",MB_OK|MB_ICONSTOP); return false;}
		
		//Ищем документ по обозначению
		CaplInstance *doc=m_api->m_doc_mgr.FindDocById("ГОСТ Р ИСО 10018-2014");

		if(0==doc) // Не нашли - создаем
		{
			// Ищем вид документа
			// В БД Созвездия есть "Государственный стандарт", "Стандарт организации",
			// "Отраслевой стандарт", "Технические условия", "Инструкция по охране труда" 
			// Остальное надо уточнять
			//
			// Внимание! Если в БД нет такого вида документа, то при создании документа будет выводится окно создания документа (чтобы пользователь мог выбрать ссам)
			CaplInstance *i_doc_type=m_api->m_doc_mgr.GetDocumentTypeBN(_T("Государственный стандарт"));

			// Ссылка которая будет записана в документ
			CString sRef="https://beeline.ru";

			// Создаем документ, у которого вместо blob будет ссылка
			doc= m_api->m_doc_mgr.CreateDocument("ГОСТ Р ИСО 10018-2014",
				"Менеджмент качества. Руководящие указания по вовлечению работников и их компетентности",
				"",i_doc_type,sRef,false);

			if(0==doc){AfxMessageBox("Ошибка создания документа",MB_OK|MB_ICONSTOP); return false;};

			// Записываем служебную информацию о том что создано с помощью 
			m_api->m_data.PutAttr(doc, m_api->m_doc_mgr.a_apl_doc_system,"kAssist" );
		}

		// Создаем связь между документом и объектом (уникальность связи проверяется)
		CaplInstance *doc_ref=m_api->m_doc_mgr.CreateAssociation(inst,doc);

		if(0==doc_ref){AfxMessageBox("Ошибка создания ссылки",MB_OK|MB_ICONSTOP); return false;};

		m_api->SaveChanges(); // На всякий случай принудительно скидываем изменения в БД

		AfxMessageBox("Готово!",MB_OK|MB_ICONINFORMATION);
		return true; // Данные были изменены
		
	}

	return false; // Изменений не было
}

//***********************************************************************************


bool check_references(CaplAPI* m_api, aplExtent& inExtent, bool bUpdateUI,aplExtent &out_ext, int &out_cmd)
{
	if(!m_api || !m_api->m_data.IsConnected()) return false;
	if(inExtent.GetSize()<1)  return false;

	CaplInstance *inst=inExtent[0];  // Главный объект для которого запущен пунк меню

	if(0==inst)  return false;
	if(inst->IsDeleted())  return false;
	if(inst->GetAccessmode()>aplRO)  return false;

	if(bUpdateUI)
	{
		// Здесь обработчик доступности меню.  Возвращает true - пункт доступен.   Возвращает false - пункт недоступен.

		if(m_api->m_data.IsKindOf(inst,m_api->m_prd_mgr.e_pdf)) 
		{
			if(inst->GetAccessmode()<=aplRW)  return true;
		}

		return false; // В остальных случаях пункт серый
	}

	// А здесь сама обработка при выборе пункта меню

	// Ввыведем список связанных документов содержащих в обозначении "ГОСТ"

	aplExtent ext_docs, ext_refs;
	m_api->m_doc_mgr.FindAssociatedDocuments(inst,ext_docs,ext_refs);
	m_api->m_doc_mgr.LoadDocInfo(ext_docs);

	CString sText,sId,sBuf;
	int i;
	for(i=0;i<ext_docs.GetSize();i++)
	{
		CaplInstance *doc=ext_docs[i];

		if(doc->GetAccessmode()>aplRO) continue; // Игнорируем то, к чему нет доступа на чтение

		m_api->m_data.GetAttr(doc,m_api->m_doc_mgr.a_doc_id,sId);
		
		sBuf=sId;
		sBuf.MakeUpper();
		if(sBuf.Find("ГОСТ")<0) continue;
		
		if(sText!="") sText+="\n";
		sText+=sId;

		m_api->m_doc_mgr.GetFullFileName(doc,sBuf);
		if(sBuf!="")  {sText+="  ";	sText+=sBuf;}

		m_api->m_data.GetAttr(doc, m_api->m_doc_mgr.a_apl_doc_system,sBuf);
		if(sBuf=="kAssist") sText+=" (Создано kAssist)";
	}
	if(sText=="") AfxMessageBox("Документов с \"ГОСТ\" не найдено!",MB_OK|MB_ICONINFORMATION);
	else aplShowBigMsg(sText,"Документы с \"ГОСТ\"");

	return false; // Данные не изменились, поэтому false
}

//***********************************************************************************

// Записывает в sInfo  информацию о inst
bool GetInstanceInfo(CaplAPI *m_api, CaplInstance *m_inst, CString &sInfo)
{
	sInfo=_T("");
	if(0==m_inst) return false;
	if(m_inst->IsDeleted()) return false;
	if(m_inst->GetAccessmode()>aplRO) return false; // Нет доступа для просмотра объекта

	// Если стоим на документе
	if(m_api->m_data.IsKindOf(m_inst,m_api->m_doc_mgr.e_apl_doc)   // Это документ 
		|| m_api->m_data.IsKindOf(m_inst,m_api->m_doc_mgr.e_apl_doc_rev)) // Это версия документа
//		|| m_api->m_data.IsKindOf(m_inst,m_api->m_doc_mgr.e_apl_stored_document)) // Это файл
	{
		m_api->m_doc_mgr.LoadDocInfo(m_inst);

		CaplInstance *doc=0; // Документ
		CaplInstance *rev=0; // Версия документа

		if(m_api->m_data.IsKindOf(m_inst,m_api->m_doc_mgr.e_apl_doc))
		{
			sInfo=_T("Выбран документ:\r\n");
			doc=m_inst;
			m_api->m_data.GetAttr(m_inst,m_api->m_doc_mgr.a_apl_doc_active,rev);
		}
		else if(m_api->m_data.IsKindOf(m_inst,m_api->m_doc_mgr.e_apl_doc_rev))
		{
			sInfo=_T("Выбрана версия документа:\r\n");
			rev=m_inst;
			m_api->m_data.GetAttr(m_inst,m_api->m_doc_mgr.a_apl_doc_rev_doc, doc);
		}

		if(0==rev || 0==doc) return false; // Что-то не так с данными.
		if(doc->GetAccessmode()>aplRO) return false; // Нет доступа к документу
		if(rev->GetAccessmode()>aplRO) return false; // Нет доступа к версии документа

		CString sId,sName,sVer,sFileName;
		m_api->m_data.GetAttr(doc,m_api->m_doc_mgr.a_doc_id,sId);
		m_api->m_data.GetAttr(doc,m_api->m_doc_mgr.a_doc_name,sName);
		m_api->m_data.GetAttr(rev,m_api->m_doc_mgr.a_apl_doc_rev_id, sVer);

		sInfo+=_T("Обозначение: "); sInfo+= sId;  sInfo+=_T("\r\n");
		sInfo+=_T("Наименование: "); sInfo+= sName;  sInfo+=_T("\r\n");
		sInfo+=_T("Версия: "); sInfo+= sVer;  sInfo+=_T("\r\n");

		CaplInstance *stor=0; // Файл документа
		m_api->m_data.GetAttr(rev,m_api->m_doc_mgr.a_apl_doc_rev_access_form,stor);
		if(0==stor) return false;
		if(stor->GetAccessmode()>aplRO) return false;  // Нет доступа к документу

		m_api->m_data.GetAttr(stor,m_api->m_doc_mgr.a_apl_stored_document_file_name,sFileName);
		sInfo+=_T("Файл: "); sInfo+= sFileName;  sInfo+=_T("\r\n");
	}
	else if(m_api->m_data.IsKindOf(m_inst,m_api->m_prd_mgr.e_prd)   // Это изделие
		|| m_api->m_data.IsKindOf(m_inst,m_api->m_prd_mgr.e_pdf)) // Это версия изделия
	{
		m_api->m_prd_mgr.LoadPrdInfo(m_inst);

		CaplInstance *prd=0; // Изделие
		CaplInstance *pdf=0; // Версия изделия

		if(m_api->m_data.IsKindOf(m_inst,m_api->m_prd_mgr.e_prd)) 
		{
			sInfo=_T("Выбрано изделие:\r\n");
			prd=m_inst;
		}
		else if(m_api->m_data.IsKindOf(m_inst,m_api->m_prd_mgr.e_pdf))
		{
			sInfo=_T("Выбрана версия изделия:\r\n");
			pdf=m_inst;
			m_api->m_data.GetAttr(m_inst,m_api->m_prd_mgr.a_pdf_prd, prd);
		}

		if(0==prd) return false; // Что-то не так с данными.
		if(prd->GetAccessmode()>aplRO) return false; // Нет доступа к документу

		CString sId,sName,sVer;
		m_api->m_data.GetAttr(prd,m_api->m_prd_mgr.a_prd_id,sId);
		m_api->m_data.GetAttr(prd,m_api->m_prd_mgr.a_prd_name,sName);
		
		sInfo+=_T("Обозначение: "); sInfo+= sId;  sInfo+=_T("\r\n");
		sInfo+=_T("Наименование: "); sInfo+= sName;  sInfo+=_T("\r\n");
		
		if(0!=pdf)
		{
			if(pdf->GetAccessmode()>aplRO) return true; // Нет доступа к версии изделия

			m_api->m_data.GetAttr(pdf,m_api->m_prd_mgr.a_pdf_id,sVer);
			sInfo+=_T("Версия: "); sInfo+= sVer;  sInfo+=_T("\r\n");
		}

	}
	else if(m_api->m_data.IsKindOf(m_inst,m_api->m_classifier_mgr.e_apl_classifier_system))   // Это справочник
	{
		CString sId,sName;
		m_api->m_data.GetAttr(m_inst,m_api->m_classifier_mgr.a_apl_classifier_system_id,sId);
		m_api->m_data.GetAttr(m_inst,m_api->m_classifier_mgr.a_apl_classifier_system_name,sName);

		sInfo=_T("Выбран справочник:\r\n");
		sInfo+=_T("Обозначение: "); sInfo+= sId;  sInfo+=_T("\r\n");
		sInfo+=_T("Наименование: "); sInfo+= sName;  sInfo+=_T("\r\n");
	}
	else if(m_api->m_data.IsKindOf(m_inst,m_api->m_classifier_mgr.e_apl_classifier_level)) // Это уровень справочника
	{
		CaplInstance *system=0;
		m_api->m_data.GetAttr(m_inst,m_api->m_classifier_mgr.a_apl_classifier_level_system,system);

		if(0==system) return false;
		if(system->GetAccessmode()>aplRO) return false; // Нет доступа для просмотра справочника

		CString sId,sName;
		m_api->m_data.GetAttr(system,m_api->m_classifier_mgr.a_apl_classifier_system_id,sId);
		m_api->m_data.GetAttr(system,m_api->m_classifier_mgr.a_apl_classifier_system_name,sName);
		
		sInfo=_T("Выбран элемент структуры справочника\r\n");
		
		sInfo+=_T("\r\n");
		sInfo=_T("Cправочник:\r\n");
		sInfo+=_T("Обозначение: "); sInfo+= sId;  sInfo+=_T("\r\n");
		sInfo+=_T("Наименование: "); sInfo+= sName;  sInfo+=_T("\r\n");

		m_api->m_data.GetAttr(m_inst,m_api->m_classifier_mgr.a_apl_classifier_level_id,sId);
		m_api->m_data.GetAttr(m_inst,m_api->m_classifier_mgr.a_apl_classifier_level_name,sName);

		sInfo+=_T("\r\n");
		sInfo+=_T("Элемент справочника:\r\n");
		sInfo+=_T("Обозначение: "); sInfo+= sId;  sInfo+=_T("\r\n");
		sInfo+=_T("Наименование: "); sInfo+= sName;  sInfo+=_T("\r\n");
	}
	return true;
}