using Hcs.ClientNet.Api.Payload.HouseManagement;
using Hcs.ClientNet.Api.Request.HouseManagement;
using Hcs.Service.Async.HouseManagement;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace Hcs.ClientNet.Api
{
    // http://open-gkh.ru/HouseManagementServiceAsync/
    public class HouseManagementApi(ClientBase client) : ApiBase(client)
    {
        /// <summary>
        /// Экспорт лицевых счетов
        /// </summary>
        /// <param name="fiasHouseGuid">Глобальный уникальный идентификатор дома по ФИАС</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Лицевые счета</returns>
        public async Task<IEnumerable<exportAccountResultType>> ExportAccountAsync(string fiasHouseGuid, CancellationToken token = default)
        {
            var request = new ExportAccountRequest(client);
            return await request.ExecuteAsync(fiasHouseGuid, token);
        }

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

        /// <summary>
        /// Возвращает все договора ресурсоснабжения
        /// </summary>
        /// <param name="token">Токен отмены</param>
        /// <returns>Договора ресурсоснабжения</returns>
        public async Task<IEnumerable<exportSupplyResourceContractResultType>> ExportSupplyResourceContractDataAsync(CancellationToken token = default)
        {
            var request = new ExportSupplyResourceContractDataRequest(client);
            return await request.ExecuteAsync(token);
        }

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

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

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

        /// <summary>
        /// Импорт лицевого счета
        /// </summary>
        /// <param name="payload">Пейлоад лицевого счета</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>true, если операция выполнена успешно, иначе - false</returns>
        public async Task<bool> ImportAccountDataAsync(ImportAccountDataPayload payload, CancellationToken token = default)
        {
            var request = new ImportAccountDataRequest(client);
            return await request.ExecuteAsync(payload, token);
        }

        /// <summary>
        /// Импорт сведений о ДУ (создание ДУ)
        /// </summary>
        /// <param name="payload">Пейлоад ДУ</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Импортированный договор</returns>
        public async Task<importContractResultType> ImportContractDataAsync(ImportContractDataPayload payload, CancellationToken token = default)
        {
            var request = new ImportContractDataRequest(client);
            return await request.ExecuteAsync(payload, token);
        }

        /// <summary>
        /// Импорт данных дома
        /// </summary>
        /// <param name="payload">Пейлоад данных дома</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>true, если операция выполнена успешно, иначе - false</returns>
        public async Task<bool> ImportHouseUODataAsync(ImportLivingHouseUODataPayload payload, CancellationToken token = default)
        {
            var request = new ImportHouseUODataRequest(client);
            return await request.ExecuteAsync(payload, token);
        }

        /// <summary>
        /// Импорт прибора учета
        /// </summary>
        /// <param name="meteringDevice">Прибор учета</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>true, если операция выполнена успешно, иначе - false</returns>
        public async Task<bool> ImportMeteringDeviceDataAsync(MeteringDeviceFullInformationType meteringDevice, CancellationToken token = default)
        {
            var request = new ImportMeteringDeviceDataRequest(client);
            return await request.ExecuteAsync(meteringDevice, token);
        }

        /// <summary>
        /// Импорт новости для информирования граждан
        /// </summary>
        /// <param name="payload">Пейлоад новости</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>true, если операция выполнена успешно, иначе - false</returns>
        public async Task<bool> ImportNotificationDataAsync(ImportNotificationDataPayload payload, CancellationToken token = default)
        {
            var request = new ImportNotificationDataRequest(client);
            return await request.ExecuteAsync(payload, token);
        }

        /// <summary>
        /// Импорт договора ресурсоснабжения с РСО
        /// </summary>
        /// <param name="payload">Пейлоад договора ресурсоснабжения</param>
        /// <param name="token">Токен отмены</param>
        /// <returns>Импортированный договор</returns>
        public async Task<getStateResultImportResultCommonResultImportSupplyResourceContract> ImportSupplyResourceContractDataAsync(ImportSupplyResourceContractDataPayload payload, CancellationToken token = default)
        {
            var request = new ImportSupplyResourceContractDataRequest(client);
            return await request.ExecuteAsync(payload, token);
        }

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