from django.urls import path

from apps.rims.finance import views

app_name = "rims_finance"

urlpatterns = [
    path(
        "reconciliation/tranches/",
        views.TrancheDisbursementReconciliationView.as_view(),
        name="tranche_disbursement_reconciliation",
    ),
    path("budgets/", views.BudgetOverviewView.as_view(), name="budget_overview"),
    path("budgets/new/", views.BudgetCreateView.as_view(), name="budget_create"),
    path("budgets/<int:pk>/", views.BudgetDetailView.as_view(), name="budget_detail"),
    path("budgets/<int:pk>/edit/", views.BudgetUpdateView.as_view(), name="budget_edit"),
    # PRD §5.4 FRFM001 — multi-year year-allocation editor.
    path(
        "budgets/<int:pk>/year-allocations/",
        views.BudgetYearAllocationsView.as_view(),
        name="budget_year_allocations",
    ),
    # PRD §5.4 FRFM008 — exchange-rate admin (finance manager only for writes).
    path("exchange-rates/", views.ExchangeRateListView.as_view(), name="exchange_rate_list"),
    path("exchange-rates/new/", views.ExchangeRateCreateView.as_view(), name="exchange_rate_create"),
    path(
        "exchange-rates/<int:pk>/edit/",
        views.ExchangeRateUpdateView.as_view(),
        name="exchange_rate_edit",
    ),
    # PRD §5.4 FRFM012/013/015 — approval workflow configuration.
    path("approval-workflows/", views.BudgetApprovalWorkflowListView.as_view(), name="approval_workflow_list"),
    path("approval-workflows/new/", views.BudgetApprovalWorkflowCreateView.as_view(), name="approval_workflow_create"),
    path(
        "approval-workflows/<int:pk>/edit/",
        views.BudgetApprovalWorkflowUpdateView.as_view(),
        name="approval_workflow_edit",
    ),
    # PRD §5.4 FRFM046/048/049 — GL register + bank reconciliation.
    path("gl/", views.GLEntryRegisterView.as_view(), name="gl_register"),
    path("gl/<int:pk>/", views.GLEntryDetailView.as_view(), name="gl_entry_detail"),
    path("gl/<int:pk>/void/", views.VoidGLEntryView.as_view(), name="gl_entry_void"),
    path("bank-statements/", views.BankStatementListView.as_view(), name="bank_statement_list"),
    path(
        "bank-statements/upload/",
        views.BankStatementUploadView.as_view(),
        name="bank_statement_upload",
    ),
    path(
        "bank-statements/<int:pk>/",
        views.BankStatementDetailView.as_view(),
        name="bank_statement_detail",
    ),
    path(
        "bank-statements/lines/<int:pk>/match/",
        views.ConfirmBankMatchView.as_view(),
        name="bank_line_match",
    ),
    # PRD §5.4 FRFM042/043 — payment failure + retry queue.
    path("payment-retries/", views.PaymentRetryQueueView.as_view(), name="payment_retry_queue"),
    path("payment-retries/<int:pk>/", views.PaymentRetryDetailView.as_view(), name="payment_retry_detail"),
    path(
        "payment-retries/<int:pk>/retry/",
        views.RetryPaymentView.as_view(),
        name="payment_retry_attempt",
    ),
    path(
        "payment-retries/<int:pk>/abandon/",
        views.AbandonPaymentRetryView.as_view(),
        name="payment_retry_abandon",
    ),
    path(
        "disbursements/<int:pk>/execution/mark-failed/",
        views.MarkExecutionFailedView.as_view(),
        name="execution_mark_failed",
    ),
    # PRD §5.4 FRFM027 — Reforecast (rolling budget).
    path(
        "budgets/<int:pk>/reforecasts/",
        views.ReforecastListView.as_view(),
        name="reforecast_list",
    ),
    path(
        "budgets/<int:pk>/reforecasts/generate/",
        views.ReforecastGenerateView.as_view(),
        name="reforecast_generate",
    ),
    path("reforecasts/<int:pk>/", views.ReforecastDetailView.as_view(), name="reforecast_detail"),
    path(
        "reforecasts/<int:pk>/chart.json",
        views.ReforecastChartDataView.as_view(),
        name="reforecast_chart_data",
    ),
    # PRD §5.4 FRFM036/037/038 — segregation-of-duties telemetry.
    path("approval-telemetry/", views.ApprovalTelemetryView.as_view(), name="approval_telemetry"),
    path(
        "budgets/<int:pk>/approve/",
        views.ApproveBudgetTotalView.as_view(),
        name="budget_approve_total",
    ),
    path(
        "budgets/<int:pk>/lines/<int:line_pk>/approve/",
        views.ApproveBudgetLineView.as_view(),
        name="budget_approve_line",
    ),
    path(
        "budgets/<int:budget_pk>/disbursements/new/",
        views.DisbursementCreateView.as_view(),
        name="disbursement_create",
    ),
    path("disbursements/", views.DisbursementListView.as_view(), name="disbursement_list"),
    path(
        "disbursements/approvals/",
        views.DisbursementApprovalQueueView.as_view(),
        name="disbursement_approval_queue",
    ),
    path("disbursements/<int:pk>/", views.DisbursementDetailView.as_view(), name="disbursement_detail"),
    path("disbursements/<int:pk>/edit/", views.DisbursementUpdateView.as_view(), name="disbursement_edit"),
    path("disbursements/<int:pk>/approve/", views.ApproveDisbursementView.as_view(), name="disbursement_approve"),
    path("disbursements/<int:pk>/reject/", views.RejectDisbursementView.as_view(), name="disbursement_reject"),
    path(
        "disbursements/<int:pk>/resubmit/",
        views.DisbursementResubmitView.as_view(),
        name="disbursement_resubmit",
    ),
    path("disbursements/<int:pk>/execution/", views.DisbursementExecutionUpdateView.as_view(), name="disbursement_execution"),
    path(
        "disbursements/<int:pk>/reconciliation/",
        views.DisbursementReconciliationUpdateView.as_view(),
        name="disbursement_reconciliation",
    ),
    # Expenditure tracking
    path("expenditures/", views.ExpenditureListView.as_view(), name="expenditure_list"),
    path(
        "budgets/<int:budget_pk>/expenditures/new/",
        views.ExpenditureCreateView.as_view(),
        name="expenditure_create",
    ),
    path(
        "expenditures/<int:pk>/edit/",
        views.ExpenditureUpdateView.as_view(),
        name="expenditure_edit",
    ),
    path(
        "expenditures/<int:pk>/delete/",
        views.ExpenditureDeleteView.as_view(),
        name="expenditure_delete",
    ),
    path(
        "cashflow.json",
        views.CashflowChartDataView.as_view(),
        name="cashflow_data_all",
    ),
    path(
        "budgets/<int:pk>/cashflow.json",
        views.CashflowChartDataView.as_view(),
        name="cashflow_data",
    ),
    # PRD §5.4 FRFM040 — payment batching
    path("payment-batches/", views.PaymentBatchListView.as_view(), name="payment_batch_list"),
    path("payment-batches/new/", views.PaymentBatchCreateView.as_view(), name="payment_batch_create"),
    path("payment-batches/<int:pk>/", views.PaymentBatchDetailView.as_view(), name="payment_batch_detail"),
    path("payment-batches/<int:pk>/lock/", views.PaymentBatchLockView.as_view(), name="payment_batch_lock"),
    path("payment-batches/<int:pk>/cancel/", views.PaymentBatchCancelView.as_view(), name="payment_batch_cancel"),
    path("payment-batches/<int:pk>/execute/", views.PaymentBatchExecuteView.as_view(), name="payment_batch_execute"),
    path("payment-batches/<int:pk>/reverse/", views.PaymentBatchReverseView.as_view(), name="payment_batch_reverse"),
    # PRD §5.4 FRFM014/018-025 — variance + cost analytics
    path("analytics/", views.FinanceAnalyticsDashboardView.as_view(), name="analytics_dashboard"),
    # PRD §5.4 FRFM031-039 — donor reporting
    path("donor-reports/", views.DonorReportListView.as_view(), name="donor_report_list"),
    path("donor-reports/<int:pk>/", views.DonorReportDetailView.as_view(), name="donor_report_detail"),
    path("donor-reports/<int:pk>/export/", views.DonorReportExportView.as_view(), name="donor_report_export"),
]
