from django.urls import path

from apps.rims.grants import funding_views, views

app_name = "rims_grants"

urlpatterns = [
    path("manage/funding/", funding_views.FundingRecordListView.as_view(), name="funding_list"),
    path(
        "manage/funding/approvals/",
        funding_views.FundingApprovalQueueView.as_view(),
        name="funding_approval_queue",
    ),
    path("manage/funding/new/", funding_views.FundingRecordCreateView.as_view(), name="funding_create"),
    path("manage/funding/<int:pk>/", funding_views.FundingRecordDetailView.as_view(), name="funding_detail"),
    path("manage/funding/<int:pk>/edit/", funding_views.FundingRecordUpdateView.as_view(), name="funding_edit"),
    path(
        "manage/funding/<int:pk>/versions/",
        funding_views.FundingRecordVersionListView.as_view(),
        name="funding_version_list",
    ),
    path(
        "manage/funding/<int:pk>/submit-for-approval/",
        funding_views.FundingSubmitForApprovalView.as_view(),
        name="funding_submit",
    ),
    path("manage/funding/<int:pk>/approve/", funding_views.FundingApproveView.as_view(), name="funding_approve"),
    path("manage/funding/<int:pk>/reject/", funding_views.FundingRejectView.as_view(), name="funding_reject"),
    path("calls/", views.PublishedCallListView.as_view(), name="call_list"),
    path("calls/<slug:slug>/", views.CallDetailView.as_view(), name="call_detail"),
    path("calls/<slug:slug>/apply/", views.ApplyCallView.as_view(), name="call_apply"),
    # Multi-step scholarship application wizard
    path("calls/<slug:slug>/apply/scholarship/",       views.ScholarshipApplyStep1View.as_view(), name="scholarship_apply_step1"),
    path("calls/<slug:slug>/apply/scholarship/<int:pk>/personal/",      views.ScholarshipApplyStep2View.as_view(), name="scholarship_apply_step2"),
    path("calls/<slug:slug>/apply/scholarship/<int:pk>/socioeconomic/", views.ScholarshipApplyStep3View.as_view(), name="scholarship_apply_step3"),
    path("calls/<slug:slug>/apply/scholarship/<int:pk>/motivation/",    views.ScholarshipApplyStep4View.as_view(), name="scholarship_apply_step4"),
    path("calls/<slug:slug>/apply/scholarship/<int:pk>/documents/",     views.ScholarshipApplyStep5View.as_view(), name="scholarship_apply_step5"),
    path("calls/<slug:slug>/apply/scholarship/<int:pk>/psychometric/",  views.ScholarshipApplyPsychometricView.as_view(), name="scholarship_apply_psychometric"),
    path("calls/<slug:slug>/apply/scholarship/<int:pk>/review/",        views.ScholarshipApplyReviewView.as_view(), name="scholarship_apply_review"),
    # Multi-step fellowship application wizard
    path("calls/<slug:slug>/apply/fellowship/",       views.FellowshipApplyStep1View.as_view(), name="fellowship_apply_step1"),
    path("calls/<slug:slug>/apply/fellowship/<int:pk>/placement/",  views.FellowshipApplyStep2View.as_view(), name="fellowship_apply_step2"),
    path("calls/<slug:slug>/apply/fellowship/<int:pk>/documents/",  views.FellowshipApplyStep3View.as_view(), name="fellowship_apply_step3"),
    path("calls/<slug:slug>/apply/fellowship/<int:pk>/review/",     views.FellowshipApplyReviewView.as_view(), name="fellowship_apply_review"),
    # Multi-step challenge application wizard
    path("calls/<slug:slug>/apply/challenge/",       views.ChallengeApplyStep1View.as_view(), name="challenge_apply_step1"),
    path("calls/<slug:slug>/apply/challenge/<int:pk>/profile/",    views.ChallengeApplyStep2View.as_view(), name="challenge_apply_step2"),
    path("calls/<slug:slug>/apply/challenge/<int:pk>/documents/",  views.ChallengeApplyStep3View.as_view(), name="challenge_apply_step3"),
    path("calls/<slug:slug>/apply/challenge/<int:pk>/review/",     views.ChallengeApplyReviewView.as_view(), name="challenge_apply_review"),
    # PRD §5.1 FRFA-AM004 — debounced auto-save endpoint for application drafts.
    path(
        "calls/<slug:slug>/apply/autosave/",
        views.ApplicationDraftAutoSaveView.as_view(),
        name="application_autosave",
    ),
    # PRD §5.1 FRFA-CS030 — withdraw a published call.
    path(
        "manage/calls/<slug:slug>/withdraw/",
        views.CallWithdrawView.as_view(),
        name="call_withdraw",
    ),
    # PRD §5.1 FRFA-CS029 — extend submission deadline on a published call.
    path(
        "manage/calls/<slug:slug>/extend-deadline/",
        views.CallExtendDeadlineView.as_view(),
        name="call_extend_deadline",
    ),
    # PRD §5.1 FRFA-CO023 — force-close an award (Programme Director only).
    path(
        "manage/awards/<int:pk>/force-closeout/",
        views.ForceAwardCloseoutView.as_view(),
        name="award_force_closeout",
    ),
    path("reviews/", views.ReviewerQueueView.as_view(), name="review_queue"),
    path("reviews/<int:pk>/", views.ReviewSubmitView.as_view(), name="review_submit"),
    path(
        "reviews/<int:pk>/accept/",
        views.ReviewAcceptView.as_view(),
        name="review_accept",
    ),
    path(
        "reviews/<int:pk>/application/",
        views.ReviewerApplicationView.as_view(),
        name="review_application",
    ),
    # PRD §5.1 FRFA-AM029 — reviewer self-declares a conflict of interest.
    path(
        "reviews/<int:pk>/declare-coi/",
        views.ReviewerDeclareCoiView.as_view(),
        name="review_declare_coi",
    ),
    path("manage/calls/", views.ManagerCallListView.as_view(), name="manager_call_list"),
    path("manage/calls/new/", views.GrantCallCreateView.as_view(), name="call_create"),
    path("manage/calls/<slug:slug>/", views.GrantCallDetailManageView.as_view(), name="call_detail_manage"),
    path("manage/calls/<slug:slug>/edit/", views.GrantCallUpdateView.as_view(), name="call_edit"),
    path("manage/calls/<slug:slug>/publish/", views.PublishCallView.as_view(), name="call_publish"),
    path("manage/calls/<slug:slug>/close-submissions/", views.CloseSubmissionsView.as_view(), name="call_close_submissions"),
    path("manage/calls/<slug:slug>/complete/", views.CompleteCallView.as_view(), name="call_complete"),
    path(
        "manage/calls/<slug:slug>/pipeline/",
        views.ApplicantPipelineView.as_view(),
        name="applicant_pipeline",
    ),
    path(
        "manage/calls/<slug:slug>/pipeline/bulk-mark-selected/",
        views.BulkMarkSelectedView.as_view(),
        name="pipeline_bulk_mark_selected",
    ),
    path(
        "manage/calls/<slug:slug>/pipeline/reviewer-pool/",
        views.ManageReviewerPoolView.as_view(),
        name="pipeline_reviewer_pool",
    ),
    path(
        "manage/calls/<slug:slug>/pipeline/bulk-under-review/",
        views.BulkMoveToUnderReviewView.as_view(),
        name="pipeline_bulk_under_review",
    ),
    path(
        "manage/calls/<slug:slug>/pipeline/bulk-auto-assign/",
        views.BulkAutoAssignReviewersView.as_view(),
        name="pipeline_bulk_auto_assign",
    ),
    path(
        "manage/calls/<slug:slug>/pipeline/bulk-assign-reviewer/",
        views.BulkManualAssignReviewerView.as_view(),
        name="pipeline_bulk_assign_reviewer",
    ),
    path(
        "manage/calls/<slug:slug>/pipeline/bulk-shortlist/",
        views.BulkShortlistView.as_view(),
        name="pipeline_bulk_shortlist",
    ),
    path(
        "manage/calls/<slug:slug>/pipeline/bulk-reject/",
        views.BulkRejectView.as_view(),
        name="pipeline_bulk_reject",
    ),
    path(
        "manage/calls/<slug:slug>/pipeline/bulk-interview/",
        views.BulkScheduleInterviewView.as_view(),
        name="pipeline_bulk_interview",
    ),
    path(
        "manage/calls/<slug:slug>/shortlist/",
        views.GenerateShortlistView.as_view(),
        name="call_generate_shortlist",
    ),
    path(
        "manage/calls/<slug:slug>/applications/",
        views.ManagerApplicationListView.as_view(),
        name="manager_application_list",
    ),
    path(
        "manage/submitted-applications/",
        views.ManagerAllApplicationsListView.as_view(),
        name="manager_all_applications",
    ),
    path(
        # PRD §5.1 FRFA-AM040 — archived rejected/ineligible/withdrawn applications
        "manage/applications/archive/",
        views.ApplicationArchiveListView.as_view(),
        name="application_archive_list",
    ),
    path("manage/applications/<int:pk>/", views.ManagerApplicationDetailView.as_view(), name="manager_application_detail"),
    path(
        "manage/applications/<int:pk>/ack-review-conflict/",
        views.ReviewConflictAckView.as_view(),
        name="application_ack_review_conflict",
    ),
    path(
        "manage/applications/<int:pk>/po-screen/",
        views.ProgramOfficerScreenView.as_view(),
        name="application_po_screen",
    ),
    path("manage/applications/<int:pk>/shortlist/", views.ShortlistApplicationView.as_view(), name="application_shortlist"),
    path("manage/applications/<int:pk>/reject/", views.RejectApplicationView.as_view(), name="application_reject"),
    # Scholarship-specific: psychometric score entry
    path(
        "manage/applications/<int:pk>/psychometric/",
        views.RecordPsychometricScoreView.as_view(),
        name="record_psychometric_score",
    ),
    # Scholarship-specific: home validation record
    path(
        "manage/applications/<int:pk>/home-validation/",
        views.HomeValidationView.as_view(),
        name="home_validation",
    ),
    # Review criteria management per call
    path(
        "manage/calls/<slug:slug>/criteria/",
        views.ManageReviewCriteriaView.as_view(),
        name="manage_review_criteria",
    ),
    path(
        "manage/applications/<int:pk>/assign-reviewer/",
        views.AssignReviewerPostView.as_view(),
        name="application_assign_reviewer",
    ),
    path(
        "manage/applications/<int:pk>/auto-assign-reviewers/",
        views.AutoAssignReviewersView.as_view(),
        name="application_auto_assign_reviewers",
    ),
    path(
        "manage/applications/<int:pk>/interview/",
        views.InterviewCompleteToggleView.as_view(),
        name="application_interview_toggle",
    ),
    path(
        "manage/applications/<int:pk>/interview/schedule/",
        views.InterviewScheduleView.as_view(),
        name="application_interview_schedule",
    ),
    path(
        "manage/interviews/<int:pk>/outcome/",
        views.InterviewOutcomeView.as_view(),
        name="interview_outcome",
    ),
    path(
        "interviews/<int:pk>/calendar.ics",
        views.InterviewIcsView.as_view(),
        name="interview_ics",
    ),
    path(
        "manage/applications/<int:pk>/verification/",
        views.VerificationRecordCreateView.as_view(),
        name="application_verification_create",
    ),
    path(
        "manage/applications/<int:pk>/request-revision/",
        views.RequestApplicationRevisionView.as_view(),
        name="application_request_revision",
    ),
    path("manage/applications/<int:pk>/award/", views.AwardApplicationView.as_view(), name="application_award"),
    path("manage/calls/<slug:slug>/required-docs/add/", views.RequiredDocumentCreateView.as_view(), name="required_doc_add"),
    path("manage/calls/<slug:slug>/required-docs/<int:pk>/delete/", views.RequiredDocumentDeleteView.as_view(), name="required_doc_delete"),
    path("manage/awards/", views.AwardDashboardView.as_view(), name="award_dashboard"),
    path("manage/applicant-reach/", views.ApplicantReachMapView.as_view(), name="applicant_reach_map"),
    path("manage/awards/<int:pk>/", views.AwardDetailView.as_view(), name="award_detail"),
    path("manage/awards/<int:pk>/agreements/new/", views.AwardAgreementCreateView.as_view(), name="award_agreement_create"),
    path("manage/awards/<int:pk>/tranches/new/", views.AwardTrancheCreateView.as_view(), name="award_tranche_create"),
    path(
        "manage/awards/<int:pk>/periodic-reports/new/",
        views.PeriodicNarrativeReportCreateView.as_view(),
        name="periodic_narrative_report_create",
    ),
    path(
        "manage/awards/<int:pk>/periodic-reports/<int:report_pk>/submit/",
        views.PeriodicNarrativeReportSubmitView.as_view(),
        name="periodic_narrative_report_submit",
    ),
    path(
        "manage/awards/<int:pk>/periodic-reports/<int:report_pk>/decision/",
        views.PeriodicNarrativeReportDecisionView.as_view(),
        name="periodic_narrative_report_decision",
    ),
    # SRS §4.1.7 — Implementation Plan / Results Framework / Monitoring Visits.
    path(
        "manage/awards/<int:pk>/implementation-plan/new/",
        views.ImplementationPlanCreateView.as_view(),
        name="implementation_plan_create",
    ),
    path(
        "manage/awards/<int:pk>/implementation-plan/submit/",
        views.ImplementationPlanSubmitView.as_view(),
        name="implementation_plan_submit",
    ),
    path(
        "manage/awards/<int:pk>/implementation-plan/decision/",
        views.ImplementationPlanDecisionView.as_view(),
        name="implementation_plan_decision",
    ),
    path(
        "manage/awards/<int:pk>/implementation-plan/outcomes/new/",
        views.ImplementationPlanOutcomeCreateView.as_view(),
        name="implementation_plan_outcome_create",
    ),
    path(
        "manage/awards/<int:pk>/implementation-plan/outcomes/<int:outcome_pk>/outputs/new/",
        views.ImplementationPlanOutputCreateView.as_view(),
        name="implementation_plan_output_create",
    ),
    path(
        "manage/awards/<int:pk>/implementation-plan/indicators/new/",
        views.ImplementationPlanIndicatorCreateView.as_view(),
        name="implementation_plan_indicator_create",
    ),
    path(
        "manage/awards/<int:pk>/implementation-plan/outputs/<int:output_pk>/activities/new/",
        views.ImplementationPlanActivityCreateView.as_view(),
        name="implementation_plan_activity_create",
    ),
    path(
        "manage/awards/<int:pk>/implementation-plan/activities/<int:activity_pk>/progress/",
        views.ImplementationPlanActivityProgressView.as_view(),
        name="implementation_plan_activity_progress",
    ),
    path(
        "manage/awards/<int:pk>/monitoring-visits/new/",
        views.MonitoringVisitCreateView.as_view(),
        name="monitoring_visit_create",
    ),
    path(
        "manage/awards/<int:pk>/monitoring-visits/<int:visit_pk>/findings/",
        views.MonitoringVisitFindingsView.as_view(),
        name="monitoring_visit_findings",
    ),
    path(
        "manage/awards/<int:pk>/monitoring-visits/<int:visit_pk>/lock/",
        views.MonitoringVisitLockView.as_view(),
        name="monitoring_visit_lock",
    ),
    path("manage/awards/<int:pk>/amendments/new/", views.AwardAmendmentCreateView.as_view(), name="award_amendment_create"),
    path(
        "manage/amendments/<int:pk>/decision/",
        views.AwardAmendmentDecisionView.as_view(),
        name="award_amendment_decision",
    ),
    path(
        "manage/amendments/<int:pk>/resubmit/",
        views.AwardAmendmentResubmitView.as_view(),
        name="award_amendment_resubmit",
    ),
    path(
        "manage/final-reports/<int:pk>/decision/",
        views.FinalReportDecisionView.as_view(),
        name="final_report_decision",
    ),
    # PRD §5.1 FRFA-CO006 — awardee resubmit endpoints (close the comment loop).
    path(
        "final-narrative/<int:pk>/resubmit/",
        views.FinalNarrativeResubmitView.as_view(),
        name="final_narrative_resubmit",
    ),
    path(
        "final-financial/<int:pk>/resubmit/",
        views.FinalFinancialResubmitView.as_view(),
        name="final_financial_resubmit",
    ),
    path("manage/awards/<int:pk>/cancellation/new/", views.AwardCancellationCreateView.as_view(), name="award_cancellation_create"),
    path(
        "manage/cancellations/<int:pk>/",
        views.AwardCancellationDetailView.as_view(),
        name="award_cancellation_detail",
    ),
    path(
        "manage/cancellations/<int:pk>/submit/",
        views.AwardCancellationSubmitForReviewView.as_view(),
        name="award_cancellation_submit",
    ),
    path(
        "manage/cancellations/<int:pk>/withdraw/",
        views.AwardCancellationWithdrawView.as_view(),
        name="award_cancellation_withdraw",
    ),
    path(
        "manage/cancellations/<int:pk>/approve/",
        views.AwardCancellationApproveView.as_view(),
        name="award_cancellation_approve",
    ),
    path(
        "manage/cancellations/<int:pk>/reject/",
        views.AwardCancellationRejectView.as_view(),
        name="award_cancellation_reject",
    ),
    path(
        "manage/awards/<int:pk>/tranche-reconciliation/",
        views.AwardTrancheReconciliationView.as_view(),
        name="award_tranche_reconciliation",
    ),
    path(
        "manage/awards/<int:pk>/cohort-addenda/new/",
        views.CohortAddendumCreateView.as_view(),
        name="cohort_addendum_create",
    ),
    path(
        "manage/cohort-addenda/<int:pk>/",
        views.CohortAddendumDetailView.as_view(),
        name="cohort_addendum_detail",
    ),
    path(
        "manage/cohort-addenda/<int:pk>/submit/",
        views.CohortAddendumSubmitView.as_view(),
        name="cohort_addendum_submit",
    ),
    path(
        "manage/cohort-addenda/<int:pk>/withdraw/",
        views.CohortAddendumWithdrawView.as_view(),
        name="cohort_addendum_withdraw",
    ),
    path(
        "manage/cohort-addenda/<int:pk>/approve/",
        views.CohortAddendumApproveView.as_view(),
        name="cohort_addendum_approve",
    ),
    path(
        "manage/cohort-addenda/<int:pk>/reject/",
        views.CohortAddendumRejectView.as_view(),
        name="cohort_addendum_reject",
    ),
    path("manage/awards/<int:pk>/closeout/", views.AwardCloseoutView.as_view(), name="award_closeout"),
    path("director/", views.ProgramDirectorDashboardView.as_view(), name="director_dashboard"),
    path("applications/", views.MyApplicationListView.as_view(), name="application_list"),
    path("applications/<int:pk>/", views.ApplicationDetailView.as_view(), name="application_detail"),
    path(
        "applications/<int:pk>/withdraw/",
        views.ApplicationWithdrawView.as_view(),
        name="application_withdraw",
    ),
    path(
        "awards/<int:pk>/acknowledge/",
        views.AwardAcknowledgeView.as_view(),
        name="award_acknowledge",
    ),
    path("applications/<int:pk>/revise/", views.ApplicationReviseView.as_view(), name="application_revise"),
]
