using Hcs.Broker.Api.Registry;
using Hcs.Broker.Api.Type;

namespace Hcs.Broker.Api.Payload.Bills
{
    // http://open-gkh.ru/Bills/importPaymentDocumentRequest.html
    public class ImportPaymentDocumentDataPayload
    {
        // http://open-gkh.ru/Bills/importPaymentDocumentRequest/PaymentInformation.html
        public class PaymentInformation
        {
            /// <summary>
            /// БИК банка получателя
            /// </summary>
            public string bankBIK;

            /// <summary>
            /// Номер расчетного счета
            /// </summary>
            public string operatingAccountNumber;
        }

        /// <summary>
        /// Начисление по услуге
        /// </summary>
        // http://open-gkh.ru/Bills/PaymentDocumentType/ChargeInfo.html
        public interface IChargeInfo { }

        /// <summary>
        /// Главная коммунальная услуга
        /// </summary>
        // http://open-gkh.ru/Bills/PDServiceChargeType/MunicipalService.html
        public class MunicipalService : IChargeInfo
        {
            /// <summary>
            /// Необязательное. Перерасчеты, корректировки, руб.
            /// </summary>
            public decimal? moneyRecalculation;

            /// <summary>
            /// Необязательное. Льготы, субсидии, скидки, руб.
            /// </summary>
            public decimal? moneyDiscount;

            /// <summary>
            /// Необязательное. Норматив потребления коммунальных ресурсов в целях использования и содержания
            /// общего имущества в многоквартирном доме.
            /// </summary>
            public decimal? houseOverallNeedsNorm;

            /// <summary>
            /// Необязательное. Норматив потребления коммунальных услуг.
            /// </summary>
            public decimal? individualConsumptionNorm;

            /// <summary>
            /// Необязательное. Текущие показания приборов учёта коммунальных ресурсов - индивидуальных
            /// (квартирных).
            /// </summary>
            public decimal? individualConsumptionCurrentValue;

            /// <summary>
            /// Необязательное. Текущие показания приборов учёта коммунальных ресурсов - коллективных (общедомовых).
            /// </summary>
            public decimal? houseOverallNeedsCurrentValue;

            /// <summary>
            /// Необязательное. Суммарный объём коммунальных ресурсов в многоквартирном доме - в помещениях дома.
            /// </summary>
            public decimal? houseTotalIndividualConsumption;

            /// <summary>
            /// Необязательное. Суммарный объём коммунальных ресурсов в многоквартирном доме - в целях содержания
            /// общего имущества в многоквартирном доме.
            /// </summary>
            public decimal? houseTotalHouseOverallNeeds;

            /// <summary>
            /// Необязательное. Способ определения объема коммунальных ресурсов при индивидуальном потреблении.
            /// </summary>
            public MunicipalServiceVolumeDeterminingMethod? individualConsumptionVolumeDeterminingMethod;

            /// <summary>
            /// Необязательное. Объем/площадь/кол-во коммунальных ресурсов при индивидуальном потреблении.
            /// </summary>
            public decimal? individualConsumptionVolumeValue;

            /// <summary>
            /// Необязательное. Способ определения объема коммунальных ресурсов при содержании общего имущества.
            /// </summary>
            public MunicipalServiceVolumeDeterminingMethod? overallConsumptionVolumeDeterminingMethod;

            /// <summary>
            /// Необязательное. Объем/площадь/кол-во коммунальных ресурсов при содержании общего имущества.
            /// </summary>
            public decimal? overallConsumptionVolumeValue;

            /// <summary>
            /// Необязательное. Размер повышающего коэффициента.
            /// </summary>
            public decimal? multiplyingFactorRatio;

            /// <summary>
            /// Необязательное. Размер превышения платы, рассчитанной с применением повышающего коэффициента над
            /// размером платы, рассчитанной без учета повышающего коэффициента, руб.
            /// </summary>
            public decimal? amountOfExcessFees;

            /// <summary>
            /// К оплате за индивидуальное потребление коммунальной услуги, руб.
            /// </summary>
            public decimal? municipalServiceIndividualConsumptionPayable;

            /// <summary>
            /// К оплате за общедомовое потребление коммунальной услуги, руб.
            /// </summary>
            public decimal? municipalServiceCommunalConsumptionPayable;

            /// <summary>
            /// Необязательное. Размер платы за коммунальные услуги, индивидуальное потребление.
            /// </summary>
            public decimal? amountOfPaymentMunicipalServiceIndividualConsumption;

            /// <summary>
            /// Необязательное. Размер платы за коммунальные услуги, общедомовые нужды.
            /// </summary>
            public decimal? amountOfPaymentMunicipalServiceCommunalConsumption;

            /// <summary>
            /// Код услуги из справочника "Вид коммунальной услуги" НСИ 3
            /// </summary>
            public RegistryElement serviceType;

            /// <summary>
            /// Тариф/Размер платы на кв.м, руб./Размер взноса на кв.м, руб.
            /// </summary>
            public decimal rate;

            /// <summary>
            /// К оплате за расчетный период, руб.
            /// </summary>
            public decimal totalPayable;

            /// <summary>
            /// Необязательное. Начислено за расчетный период (без перерасчетов и льгот), руб.
            /// </summary>
            public decimal? accountingPeriodTotal;
        }

        // http://open-gkh.ru/Bills/importPaymentDocumentRequest/PaymentDocument.html
        public class PaymentDocument
        {
            /// <summary>
            /// Платежный реквизит
            /// </summary>
            public PaymentInformation paymentInformation;

            /// <summary>
            /// Идентификатор лицевого счета
            /// </summary>
            public string accountGuid;

            /// <summary>
            /// Необязательное. Номер платежного документа, по которому внесена плата, присвоенный такому
            /// документу исполнителем в целях осуществления расчетов по внесению платы
            /// </summary>
            public string paymentDocumentNumber;

            /// <summary>
            /// Начисления по услугам
            /// </summary>
            public List<IChargeInfo> chargeInfo;

            /// <summary>
            /// Если true, то выставлен на оплату, иначе - отозван
            /// </summary>
            public bool exposeNotWithdraw;

            /// <summary>
            /// Необязательное. Задолженность за предыдущие периоды, руб.
            /// </summary>
            public decimal? debtPreviousPeriods;

            /// <summary>
            /// Необязательное. Аванс на начало расчетного периода, руб.
            /// </summary>
            public decimal? advanceBllingPeriod;

            /// <summary>
            /// Необязательное. Итого к оплате за расчетный период c учетом задолженности/переплаты, руб.
            /// (по всему платежному документу)
            /// </summary>
            public decimal? totalPayableByPDWithDebtAndAdvance;

            /// <summary>
            /// Необязательное. Сумма к оплате за расчетный период, руб. (по всему платежному документу).
            /// </summary>
            public decimal? totalPayableByPD;

            /// <summary>
            /// Необязательное. Оплачено денежных средств, руб.
            /// </summary>
            public decimal? paidCash;

            /// <summary>
            /// Необязательное. Дата последней поступившей оплаты
            /// </summary>
            public DateTime? dateOfLastReceivedPayment;
        }

        /// <summary>
        /// Необязательное. Если true, то передаваемые данные платежных документов, следует считать верными,
        /// даже если они отличаются от автоматически рассчитанных системой значений. В том случае, если параметр
        /// не заполнен, то ГИС ЖХК будет проводить автоматическую проверку рассчитываемых сумм по ПД.
        /// </summary>
        public bool confirmAmountsCorrect;

        /// <summary>
        /// Месяц расчетного периода платежного документа
        /// </summary>
        public int month;

        /// <summary>
        /// Год расчетного периода платежного документа
        /// </summary>
        public short year;

        /// <summary>
        /// Сведения о платежных реквизитах получателя платежа - бизнес-ключ поиска размещенных платежных
        /// реквизитов в ГИС ЖКХ
        /// </summary>
        public PaymentInformation[] paymentInformation;

        /// <summary>
        /// Размещаемый платежный документ. Максимум 500.
        /// </summary>
        public PaymentDocument[] paymentDocument;
    }
}
