using CashLineERP.Contracts.Identity;
using CashLineERP.Contracts.External;
using CashLineERP.Contracts.Parties;
using CashLineERP.Contracts.Tax;

namespace CashLineERP.Application.Identity;

public interface IAccountingOfficeService
{
    IReadOnlyCollection<AccountingOfficeClientAssignmentResponse> GetAssignments(long accountingOfficeUserId);

    AccountingOfficeClientAssignmentResponse AssignClient(long accountingOfficeUserId, AssignAccountingOfficeClientRequest request, long actorUserId);

    void RemoveClient(long accountingOfficeUserId, long partyId, long actorUserId);

    IReadOnlyCollection<AccountingOfficeClientAssignmentResponse> GetCurrentUserClients(long accountingOfficeUserId);

    AccountingOfficeClientWorkspaceResponse GetCurrentUserClientWorkspace(long accountingOfficeUserId, long partyId);

    AccountingOfficeClientSubmissionPostureResponse GetCurrentUserClientSubmissionPosture(long accountingOfficeUserId, long partyId);

    BusinessPartyComplianceDocumentResponse RecordCurrentUserClientComplianceDocument(long accountingOfficeUserId, long partyId, RecordBusinessPartyComplianceDocumentRequest request);

    EtaSubmissionValidationPackResponse? GetCurrentUserClientInvoiceEtaValidationPack(long accountingOfficeUserId, long partyId, long invoiceId);

    IReadOnlyCollection<EtaSubmissionLogResponse> GetCurrentUserClientInvoiceEtaSubmissionLogs(long accountingOfficeUserId, long partyId, long invoiceId);

    EtaSubmissionLogResponse SubmitCurrentUserClientInvoiceToEta(long accountingOfficeUserId, long partyId, long invoiceId, SubmitInvoiceToEtaRequest request);

    IReadOnlyCollection<ExternalStatementDocumentResponse> GetCurrentUserClientStatementDocuments(long accountingOfficeUserId, long partyId);

    IReadOnlyCollection<ExternalStatementDeliveryLogResponse> GetCurrentUserClientStatementDeliveryLogs(long accountingOfficeUserId, long partyId, long statementId);

    ExternalStatementDeliveryLogResponse RecordCurrentUserClientStatementDelivery(long accountingOfficeUserId, long partyId, long statementId, RecordAccountingOfficeClientStatementDeliveryRequest request);

    ExternalStatementDeliveryLogResponse AcknowledgeCurrentUserClientSupplierStatementDelivery(long accountingOfficeUserId, long partyId, long statementId, long deliveryLogId, AcknowledgeAccountingOfficeClientStatementDeliveryRequest request);

    ExternalStatementDeliveryLogResponse RetryCurrentUserClientStatementDelivery(long accountingOfficeUserId, long partyId, long statementId, long deliveryLogId, RetryAccountingOfficeClientStatementDeliveryRequest request);

    ExternalStatementDocumentResponse GenerateCurrentUserClientStatement(long accountingOfficeUserId, long partyId, GenerateAccountingOfficeClientStatementRequest request);

    string ExportCurrentUserClientReportCsv(long accountingOfficeUserId, long partyId);

    IReadOnlyCollection<AccountingOfficeDelegatedActivityResponse> GetCurrentUserActivity(long accountingOfficeUserId, long? partyId = null);
}
