#ifndef _SH5RKI_H_
#define _SH5RKI_H_

#include <windows.h>
#include "sh5rki_ver.h"

#ifdef _SH5RKI_SOURCE
	#define SH5RKI_SPEC __declspec(dllexport)
#else
	#define SH5RKI_SPEC __declspec(dllimport)
#endif

#ifndef NOTHROW
	#define NOTHROW __declspec(nothrow)
#endif

// Возвращает версию библиотеки (старшее и младшее слово - основная версия и подверсия);
// Может вызываться до вызова ShrInit().
SH5RKI_SPEC DWORD NOTHROW WINAPI ShrGetVer(
			DWORD* pdwBaseVer = NULL, // базовая версия
			DWORD* pdwMinVer = NULL); // мин. совместимая базовая версия
// Проверяет версию библиотеки на совместимость. 
// В качестве параметра необходимо передать константу SH5RKI_VER_Base.
// Возвращает FALSE в случае несовместимой базовой версии, и ненулевое значение
// в противном случае. Может вызываться до вызова ShrInit().
SH5RKI_SPEC BOOL NOTHROW WINAPI ShrCheckVer(DWORD dwBaseVer);
// Инициализирует библиотеку.
// Возвращает FALSE при ошибке (м.б.вызваны ф-ции ShrGetErrorInfo и ShrGetErrorText для получения информации об ошибке).
SH5RKI_SPEC BOOL NOTHROW WINAPI ShrInit(DWORD dwBaseVer = VER_SH5RKI_Base, DWORD dwMaxCacheSize = 0);
// Возвращает информацию об ошибке: имя модуля, номер ошибки и ошибку Win32.
SH5RKI_SPEC LPCSTR NOTHROW WINAPI ShrGetErrorInfo(DWORD* pdwError, DWORD* pdwOsError = NULL);
// Возвращают текстовое описание ошибки.
SH5RKI_SPEC LPCSTR NOTHROW WINAPI ShrGetErrorTextA();
SH5RKI_SPEC LPCWCH NOTHROW WINAPI ShrGetErrorTextW();




struct ShrLoginStruct {
	#define sdbProtLocal     0
	#define sdbProtTcpip     1
	DWORD   dwProtocolId;  // протокол sdbProtLocal/sdbProtTcpip
	DWORD   dwPort;        // для tcp/ip - порт; 0 => использовать порт по умолчанию
	LPCSTR  pszServerName; // имя/ip-адрес сервера
	LPCSTR  pszUserName;   // имя пользователя; если pszUserName == NULL, аутентификация
						   // производится через Windows (pszPassword в этом случае игнорируется)
	LPCSTR  pszPassword;   // пароль пользователя
};
// Устанавливает соединение с БД.  
// Возвращает FALSE при ошибке (м.б.вызваны ф-ции ShrGetErrorInfo и ShrGetErrorText для получения информации об ошибке).
SH5RKI_SPEC BOOL NOTHROW WINAPI ShrLogin(ShrLoginStruct const*);
// Закрывает соединение с БД.
SH5RKI_SPEC void NOTHROW WINAPI ShrLogout();

// Предполагаемая цена (см. процедуру сервера склада EstimateCost).
// Возвращает FALSE при ошибке (м.б.вызваны ф-ции ShrGetErrorInfo и ShrGetErrorText для получения информации об ошибке).
#pragma pack(push,1)
struct EstimatedCostRec {
	// IN
	GUID Guid;
	// OUT
	__int64 ISum;  // закупочные сумма бн,
	__int64 ITax1; // НДС
	__int64 ITax2; // НСП
	DWORD ErrСode; // 0-Ok
	// IN
	void* pUserData; // не модифицируется процедурой ShrEstimatedCost()
};
#pragma pack(pop)

SH5RKI_SPEC BOOL NOTHROW WINAPI ShrEstimatedCost(
		// IN
		WORD wDate,         // DateFrom (кол.во дней от 01.01.1980 (01.01.1980 соотв. 0). 0xFFFF - текущая дата
		WORD wCostType,     // 0-Fifo, 1-послед.прих, 2-средневзв.
		DWORD dwDepartRid,  // ключ подразделения
		DWORD dwRecCount,   // кол-во запрашиваемых товаров (размер массива)
		// IN/OUT
		EstimatedCostRec* pRecs); // список товаров



#pragma pack(push,1)
struct DepartListRec {
	DepartListRec const* pNext;    // указатель на следующий склад (если ноль, то складов больше нет)
	DWORD                dwRid;    // первичный ключ склада
	char                 NameA[1]; // название склада
};
#pragma pack(pop)
typedef DepartListRec const* PCDepartListRec;

// Список подразделений (складов).
// Возвращает FALSE при ошибке (м.б.вызваны ф-ции ShrGetErrorInfo и ShrGetErrorText для получения информации об ошибке).
// Список складов возвращается через *pDepartList (если нет ни одного склада, *pDepartList б. равно нулю).
// После использования память д.б. освобождена вызовом ShrFreeDepartList().
SH5RKI_SPEC BOOL NOTHROW WINAPI ShrGetDepartListA(PCDepartListRec* pDepartList);
// Освобождает память, занятую вызовом ShrGetDepartList()
SH5RKI_SPEC void NOTHROW WINAPI ShrFreeDepartList(PCDepartListRec);


// Локализация
/*
Для подмены загружаемых строк необходимо установить обработчики загрузки строк,
вызвав методы domm.dll _SetLoadStrAHandlers и/или _SetLoadStrWHandlers:

#include "domm.h" 
void SetLoadStrHandlers()
{
	// _SetLoadStrAHandlers(...);
	// _SetLoadStrWHandlers(...);
}
*/

#endif // !_SH5RKI_H_


