using Hcs.Broker.Api.Payload.HouseManagement;
using Hcs.Service.Async.HouseManagement;

namespace Hcs.Broker.Api
{
    // http://open-gkh.ru/HouseManagementServiceAsync/
    public interface IHouseManagementApi
    {
        /// <summary>
        /// Экспорт лицевых счетов
        /// </summary>
        /// <param name="fiasHouseGuid">Глобальный уникальный идентификатор дома по ФИАС</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Лицевые счета</returns>
        Task<IEnumerable<exportAccountResultType>> ExportAccountAsync(string fiasHouseGuid, CancellationToken token = default);

        /// <summary>
        /// Возвращает информацию о доме
        /// </summary>
        /// <param name="fiasHouseGuid">Глобальный уникальный идентификатор дома по ФИАС</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Информация о доме</returns>
        Task<IEnumerable<exportHouseResultType>> ExportHouseAsync(string fiasHouseGuid, CancellationToken token = default);

        /// <summary>
        /// Возвращает все договора ресурсоснабжения
        /// </summary>
        /// <param name="token">Токен отмены</param>
        /// <returns>Договора ресурсоснабжения</returns>
        Task<IEnumerable<exportSupplyResourceContractResultType>> ExportSupplyResourceContractDataAsync(CancellationToken token = default);

        /// <summary>
        /// Возвращает договор ресурсоснабжения по его идентификатору в ГИС ЖКХ
        /// </summary>
        /// <param name="contractRootGuid">Идентификатор договора ресурсоснабжения в ГИС ЖКХ</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Договор ресурсоснабжения</returns>
        Task<exportSupplyResourceContractResultType> ExportSupplyResourceContractDataAsync(Guid contractRootGuid, CancellationToken token = default);

        /// <summary>
        /// Возвращает договор ресурсоснабжения по номеру договора в ГИС ЖКХ
        /// </summary>
        /// <param name="contractNumber">Номер договора ресурсоснабжения в ГИС ЖКХ</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Договор ресурсоснабжения</returns>
        Task<exportSupplyResourceContractResultType> ExportSupplyResourceContractDataAsync(string contractNumber, CancellationToken token = default);

        /// <summary>
        /// Возвращает объекты жилищного фонда из договора ресурсоснабжения по его идентификатору
        /// </summary>
        /// <param name="contractRootGuid">Идентификатор договора ресурсоснабжения в ГИС ЖКХ</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Объекты жилищного фонда</returns>
        Task<IEnumerable<exportSupplyResourceContractObjectAddressResultType>> ExportSupplyResourceContractObjectAddressDataAsync(Guid contractRootGuid, CancellationToken token = default);

        /// <summary>
        /// Импорт лицевого счета
        /// </summary>
        /// <param name="payload">Пейлоад лицевого счета</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>true, если операция выполнена успешно, иначе - false</returns>
        Task<bool> ImportAccountDataAsync(ImportAccountDataPayload payload, CancellationToken token = default);

        /// <summary>
        /// Импорт сведений о ДУ (создание ДУ)
        /// </summary>
        /// <param name="payload">Пейлоад ДУ</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Импортированный договор</returns>
        Task<importContractResultType> ImportContractDataAsync(ImportContractDataPayload payload, CancellationToken token = default);

        /// <summary>
        /// Импорт данных дома
        /// </summary>
        /// <param name="payload">Пейлоад данных дома</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>true, если операция выполнена успешно, иначе - false</returns>
        Task<bool> ImportHouseUODataAsync(ImportLivingHouseUODataPayload payload, CancellationToken token = default);

        /// <summary>
        /// Импорт прибора учета
        /// </summary>
        /// <param name="meteringDevice">Прибор учета</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>true, если операция выполнена успешно, иначе - false</returns>
        Task<bool> ImportMeteringDeviceDataAsync(MeteringDeviceFullInformationType meteringDevice, CancellationToken token = default);

        /// <summary>
        /// Импорт новости для информирования граждан
        /// </summary>
        /// <param name="payload">Пейлоад новости</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>true, если операция выполнена успешно, иначе - false</returns>
        Task<bool> ImportNotificationDataAsync(ImportNotificationDataPayload payload, CancellationToken token = default);

        /// <summary>
        /// Импорт договора ресурсоснабжения с РСО
        /// </summary>
        /// <param name="payload">Пейлоад договора ресурсоснабжения</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Импортированный договор</returns>
        Task<getStateResultImportResultCommonResultImportSupplyResourceContract> ImportSupplyResourceContractDataAsync(ImportSupplyResourceContractDataPayload payload, CancellationToken token = default);

        /// <summary>
        /// Импорт проекта договора ресурсоснабжения с РСО
        /// </summary>
        /// <param name="payload">Пейлоад проекта договора ресурсоснабжения</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Импортированный проект договора</returns>
        Task<getStateResultImportResultCommonResultImportSupplyResourceContractProject> ImportSupplyResourceContractProjectAsync(ImportSupplyResourceContractProjectPayload payload, CancellationToken token = default);
    }
}
