using System;
using System.Collections.Generic;
using System.ServiceModel;

using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Reports;

namespace BeWo.Service.ServiceContracts
{
    [ServiceContract]
    public interface IAccountingService
    {
        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateInvoiceBases(List<InvoiceBaseDC> invoices);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateServiceInvoices(List<ServiceInvoiceDC> invoices);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateSettlementInvoice(List<Settlement2DC> invoices);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<ServiceInvoiceDC> GenerateInitialServiceInvoices(long costBearerOid, long? supportConceptOid, DateTimeSpan invoicePeriod);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<InvoiceBaseDC> GetAllActiveInvoiceBases();

	    [FaultContract(typeof (BeWoFault))]
	    [OperationContract]
	    List<InvoiceBaseDC> GetInvoiceBases(DateTime? startDate, DateTime? endDate);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<InvoiceBaseDC> GetGeneralInvoiceBasesForCustomer(long customerOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<InvoiceBaseDC> GetGeneralInvoiceBasesForOrganisation(long organisationOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<InvoiceBaseDC> GetGeneralInvoiceBasesForPerson(long personOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<InvoiceBaseDC> GetInvoiceBasesForSupportConcept(InvoiceType type, long supportConceptOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        ServiceInvoiceDC GetServiceInvoiceByInvoiceBaseOid(long invoiceBaseOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<ServiceInvoiceDC> GetServiceInvoices(long costBearerOid, long? supportConceptOid, DateTimeSpan period);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        Settlement2DC GetSettlementByInvoiceBaseOid(long invoiceBaseOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<Settlement2DC> GetSettlementInvoicesForCostBearerAndPeriod(long costBearerOid, DateTime periodStart, DateTime periodEnd);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<Settlement2DC> GetSettlementInvoicesForSupportConcept(long supportConceptOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<long> InsertNewInvoiceBases(List<InvoiceBaseDC> invoices);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<long> InsertNewServiceInvoices(List<ServiceInvoiceDC> invoices);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<long> InsertNewSettlementInvoice(List<Settlement2DC> invoices);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        InvoiceBaseDC LoadInvoiceBaseByOid(long invoiceBaseOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        InvoiceNumberDC LoadInvoiceNumber();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        ServiceInvoiceDC LoadServiceInvoiceByOid(long serviceInvoiceOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<long> UpdateInvoiceBases(List<InvoiceBaseDC> invoices);

        [FaultContract(typeof (BeWoFault))]
        [OperationContract]
        List<long> SetInvoicePaid(List<InvoiceBaseDC> invoices, bool isPaid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        InvoiceNumberDC UpdateInvoiceNumber(InvoiceNumberDC dc);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<long> UpdateServiceInvoices(List<ServiceInvoiceDC> invoices);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void UpdateSettlementInvoice(List<Settlement2DC> invoices);

    }
}