using CashLineERP.Contracts.Reporting;

namespace CashLineERP.Application.Reporting;

public interface ICoreReportingService
{
    CoreFinanceReportResponse GetCoreFinanceReport(DateOnly? dateFrom, DateOnly? dateTo);

    CoreOperationsReportResponse GetCoreOperationsReport(DateOnly? dateFrom, DateOnly? dateTo);

    IslamicFinancePipelineReportResponse GetIslamicFinancePipelineReport(DateOnly? dateFrom, DateOnly? dateTo, long? partnerLenderId = null);

    FinanceStakeholderSummaryReportResponse GetFinanceStakeholderSummaryReport(DateOnly? dateFrom, DateOnly? dateTo);

    FinanceStakeholderDetailReportResponse GetFinanceStakeholderDetailReport(string stakeholderType, long stakeholderId, string currencyCode, DateOnly? dateFrom, DateOnly? dateTo);

    FinancialStatementReportResponse GetFinancialStatementReport(string statementCode, DateOnly? dateFrom, DateOnly? dateTo, DateOnly? asOfDate);

    FinancialStatementExportContent ExportFinancialStatement(string statementCode, string formatCode, DateOnly? dateFrom, DateOnly? dateTo, DateOnly? asOfDate);

    AgingReportResponse GetAccountsPayableAgingReport(DateOnly? asOfDate);

    AgingReportResponse GetAccountsReceivableAgingReport(DateOnly? asOfDate);

    string ExportCoreFinanceReportCsv(DateOnly? dateFrom, DateOnly? dateTo);

    string ExportCoreOperationsReportCsv(DateOnly? dateFrom, DateOnly? dateTo);

    string ExportIslamicFinancePipelineReportCsv(DateOnly? dateFrom, DateOnly? dateTo, long? partnerLenderId = null);

    string ExportFinanceStakeholderSummaryReportCsv(DateOnly? dateFrom, DateOnly? dateTo);

    string ExportFinanceStakeholderDetailReportCsv(string stakeholderType, long stakeholderId, string currencyCode, DateOnly? dateFrom, DateOnly? dateTo);

    string ExportAccountsPayableAgingReportCsv(DateOnly? asOfDate);

    string ExportAccountsReceivableAgingReportCsv(DateOnly? asOfDate);

    IReadOnlyCollection<ReportingSnapshotSummaryResponse> GetReportingSnapshots(string? reportCode = null);

    ReportingSnapshotResponse? GetReportingSnapshot(long reportingSnapshotId);

    ReportingSnapshotResponse GenerateReportingSnapshot(long actorUserId, CreateReportingSnapshotRequest request);
}
