<?php

use App\Http\Controllers\Api\AdminRegistrationController;
use App\Http\Controllers\Api\AiAssistantController;
use App\Http\Controllers\Api\B2cTransferController;
use App\Http\Controllers\Api\BulkSmsController;
use App\Http\Controllers\Api\DocumentController;
use App\Http\Controllers\Api\DocumentAdminController;
use App\Http\Controllers\Api\ImportController;
use App\Http\Controllers\Api\MeetingMinutesController;
use App\Http\Controllers\Api\MemberController;
use App\Http\Controllers\Api\MemberRegistrationController;
use App\Http\Controllers\Api\MemberStatsController;
use App\Http\Controllers\Api\OperationalTopupController;
use App\Http\Controllers\Api\SignatureController;
use App\Http\Controllers\Api\SuperAdminStatsController;
use App\Http\Controllers\Api\ViewMemberController;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\HealthController;
use App\Http\Controllers\NotificationController;
use App\Http\Controllers\PaymentController;
use App\Http\Controllers\RestApiController;
use App\Http\Controllers\StorageController;
use App\Http\Controllers\WalletController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| KHWWC API Routes
|--------------------------------------------------------------------------
| The Laravel app is mounted under /api in the same deployment model.
*/

Route::get('/health', [HealthController::class, 'health']);
Route::get('/system/info', [HealthController::class, 'systemInfo']);

Route::prefix('/auth/v1')->group(function () {
    Route::post('/token', [AuthController::class, 'token'])->middleware('throttle:login');
    Route::post('/signup', [AuthController::class, 'signup'])->middleware('throttle:login');
    Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/heartbeat', [AuthController::class, 'heartbeat'])->middleware('auth.jwt', 'throttle:api');
    Route::get('/user', [AuthController::class, 'user'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/password', [AuthController::class, 'changePassword'])->middleware('auth.jwt', 'throttle:api');
});

Route::get('/welfare_settings', [RestApiController::class, 'publicSettings']);

Route::prefix('/rest/v1')->group(function () {
    Route::match(['get', 'post', 'patch', 'delete', 'put'], '/{table}', [RestApiController::class, 'handle'])
        ->middleware('auth.jwt', 'throttle:api');
});

Route::prefix('/storage/v1')->group(function () {
    Route::get('/object/{bucket}/{path}', [StorageController::class, 'download'])->name('storage.download')->where('path', '.+');
    Route::get('/object/{bucket}/{path}/signed-url', [StorageController::class, 'signedUrl'])->middleware('auth.jwt', 'throttle:api')->where('path', '.+');
    Route::post('/object/{bucket}/{path}', [StorageController::class, 'upload'])->middleware('auth.jwt', 'throttle:api')->where('path', '.+');
    Route::delete('/object/{bucket}/{path}', [StorageController::class, 'delete'])->middleware('auth.jwt', 'throttle:api')->where('path', '.+');
});

Route::middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::get('/me', function (Request $request) {
        return response()->json([
            'identity' => $request->attributes->get('identity'),
        ]);
    });

    // --- Admin "View Member Dashboard" (server-authorized impersonation) ---
    // Start/exit/status are admin-only; the session token is bound to the real
    // admin user and the target member. Member-scoped endpoints read the
    // viewed member from the X-View-As-Member header via the Authenticate
    // middleware, never from request bodies or query strings.
    Route::prefix('/admin/members')->group(function () {
        Route::post('/{memberId}/view-as-member', [ViewMemberController::class, 'start']);
        Route::delete('/view-as-member', [ViewMemberController::class, 'exit']);
        Route::get('/view-as-member', [ViewMemberController::class, 'status']);
    });
});

Route::prefix('/payments')->group(function () {
    Route::post('/stk-push', [PaymentController::class, 'stkPush'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/stk-callback', [PaymentController::class, 'stkCallback'])->middleware('throttle:api', 'verify.coop.callback');
    Route::get('/status/{checkoutRequestId}', [PaymentController::class, 'status'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/bank-sync', [PaymentController::class, 'bankSync'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/reconcile-stk', [PaymentController::class, 'reconcileStk'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/b2c', [PaymentController::class, 'b2cTransfer'])->middleware('auth.jwt', 'throttle:api');
});

Route::prefix('/notifications')->middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::post('/bulk-sms', [NotificationController::class, 'bulkSms']);
    Route::post('/push', [NotificationController::class, 'push']);
});

Route::prefix('/wallets/{walletType}')->middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::post('/credit', [WalletController::class, 'credit']);
    Route::post('/debit', [WalletController::class, 'debit']);
    Route::get('/balance', [WalletController::class, 'balance']);
    Route::get('/transactions', [WalletController::class, 'transactions']);
});

Route::middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::post('/{table}/{id}/approve', [RestApiController::class, 'approveRecord'])
        ->where('table', 'registrations');
    Route::post('/{table}/{id}/reject', [RestApiController::class, 'rejectRecord'])
        ->where('table', 'registrations');
    Route::post('/{table}/update', [RestApiController::class, 'handleCustomUpdate'])
        ->where('table', 'withdrawal_signatories|donation_withdrawal_signatories|operational_withdrawal_signatories');
    Route::post('/{table}/update-status', [RestApiController::class, 'handleCustomUpdateStatus'])
        ->where('table', 'penalty_withdrawals|donation_withdrawals|operational_withdrawals');

    // --- Member Documents (audit 2026-09-04) — register BEFORE the catch-all so it matches first.
    Route::prefix('/documents')->group(function () {
        Route::get('/types', [DocumentController::class, 'types']);
        Route::get('/me', [DocumentController::class, 'myDocuments']);
        Route::get('/me/summary', [DocumentController::class, 'mySummary']);
        Route::get('/me/types', [DocumentController::class, 'myTypes']);
        Route::post('', [DocumentController::class, 'upload']);
        Route::patch('/{id}', [DocumentController::class, 'update']);
        Route::delete('/{id}', [DocumentController::class, 'destroy']);
        Route::get('/{id}', [DocumentController::class, 'show']);
        Route::post('/{id}/approve', [DocumentController::class, 'approve']);
        Route::post('/{id}/reject', [DocumentController::class, 'reject']);
        Route::post('/{id}/replace', [DocumentController::class, 'replace']);
    });
    Route::prefix('/admin/documents')->group(function () {
        Route::get('/', [DocumentAdminController::class, 'index']);
        Route::get('/summary', [DocumentAdminController::class, 'summary']);
        Route::get('/audit', [DocumentAdminController::class, 'audit']);
        Route::get('/expiring', [DocumentAdminController::class, 'expiring']);
        Route::get('/missing', [DocumentAdminController::class, 'missing']);
        Route::get('/member/{memberId}', [DocumentAdminController::class, 'forMember']);
        Route::get('/orphans', [DocumentAdminController::class, 'orphans']);
        Route::post('/types', [DocumentAdminController::class, 'createType']);
        Route::patch('/types/{code}', [DocumentAdminController::class, 'updateType']);
    });

    Route::match(['GET', 'POST', 'PATCH', 'DELETE', 'PUT'], '/{table}', [RestApiController::class, 'handle'])
        ->where('table', 'members|contributions|donation-campaigns|donation_campaigns|donation-withdrawals|donation_withdrawals|member-access-logs|member_access_logs|operational-withdrawals|operational_withdrawals|organization-settings|organization_settings|payments|penalties|penalty-payment-records|penalty_payment_records|penalty_payments|penalty-wallet|penalty_wallet|penalty-withdrawals|penalty_withdrawals|signatory-signatures|signatory_signatures|system-logs|system_logs|user-roles|user_roles|withdrawals|registrations|withdrawal-signatories|withdrawal_signatories|donation-withdrawal-signatories|donation_withdrawal_signatories|operational-withdrawal-signatories|operational_withdrawal_signatories|beneficiaries|beneficiary-requests|beneficiary_requests|book_balance|book_balances|chats|conversation-participants|conversation_participants|conversations|dashboard_security|donation_wallet|events|executive-badges|executive_badges|expenses|financial_reports|meeting_attendance|meeting_minutes|member_executive_roles|memo-recipients|memo_recipients|memo-templates|memo_templates|memos|message-reactions|message_reactions|messages|news|news-read|news_read|notifications|office-bearer-signatures|office_bearer_signatures|operational_wallet|payouts|password_resets|reports|unmatched_payments|user_presence|wallet_transactions|welfare_settings');
});

Route::prefix('/banking/coop')->group(function () {
    Route::prefix('/callback')->middleware('verify.coop.callback')->group(function () {
        Route::post('/transfer', [\App\Http\Controllers\Banking\CoopCallbackController::class, 'handleTransfer']);
        Route::post('/stk', [\App\Http\Controllers\Banking\CoopCallbackController::class, 'handleStk']);
        Route::post('/ins', [\App\Http\Controllers\Banking\CoopCallbackController::class, 'handleIns']);
        Route::post('/validation', [\App\Http\Controllers\Banking\CoopCallbackController::class, 'handleTransfer']);
    });

    Route::middleware(['auth.jwt', 'throttle:api'])->group(function () {
        Route::post('/transfers/b2c', [\App\Http\Controllers\Banking\CoopTransferController::class, 'b2cWithdrawal']);
        Route::post('/transfers/pesalink', [\App\Http\Controllers\Banking\CoopTransferController::class, 'pesalinkWithdrawal']);
        Route::get('/transfers/{messageReference}/status', [\App\Http\Controllers\Banking\CoopTransferController::class, 'status']);
        Route::post('/transactions/status', [\App\Http\Controllers\Banking\CoopTransferController::class, 'queryBankStatus']);

        Route::get('/account/balance', [\App\Http\Controllers\Banking\CoopAccountController::class, 'balance']);
        Route::get('/account/ministatement', [\App\Http\Controllers\Banking\CoopAccountController::class, 'miniStatement']);
        Route::get('/account/statement', [\App\Http\Controllers\Banking\CoopAccountController::class, 'statement']);
        Route::post('/account/sync', [\App\Http\Controllers\Banking\CoopAccountController::class, 'syncStatement']);
        Route::post('/account/reconcile', [\App\Http\Controllers\Banking\CoopAccountController::class, 'reconcile']);
        Route::get('/account/sync-history', [\App\Http\Controllers\Banking\CoopAccountController::class, 'syncHistory']);
        Route::get('/reconciliation/status', [\App\Http\Controllers\Banking\CoopAccountController::class, 'reconciliationStatus']);
        Route::get('/dashboard/summary', [\App\Http\Controllers\Banking\CoopAccountController::class, 'dashboardSummary']);
        Route::get('/dashboard/financial', [\App\Http\Controllers\Banking\CoopAccountController::class, 'financialSummary']);
        Route::get('/reconciliation/report', [\App\Http\Controllers\Banking\CoopAccountController::class, 'reconciliationReport']);
        Route::get('/transactions', [\App\Http\Controllers\Banking\CoopAccountController::class, 'bankTransactionsList']);
        Route::get('/transactions/{id}', [\App\Http\Controllers\Banking\CoopAccountController::class, 'bankTransactionDetail']);
        Route::post('/transactions/{id}/reconcile', [\App\Http\Controllers\Banking\CoopAccountController::class, 'bankTransactionReconcile']);
        Route::get('/members/{memberId}/transactions', [\App\Http\Controllers\Banking\CoopAccountController::class, 'memberBankTransactions']);
        Route::post('/diagnostics/connectivity', [\App\Http\Controllers\Banking\CoopBankDiagnosticController::class, 'connectivity']);
        Route::post('/diagnostics/run/{testType}', [\App\Http\Controllers\Banking\CoopBankDiagnosticController::class, 'runTest']);
        Route::get('/diagnostics/history', [\App\Http\Controllers\Banking\CoopBankDiagnosticController::class, 'history']);
        Route::get('/diagnostics/report/{diagnosticId}', [\App\Http\Controllers\Banking\CoopBankDiagnosticController::class, 'report']);
        Route::get('/diagnostics/report/latest', [\App\Http\Controllers\Banking\CoopBankDiagnosticController::class, 'lastReport']);
    });
});

Route::prefix('/functions/v1')->group(function () {
    Route::prefix('/admin-registration')->middleware('auth.jwt', 'throttle:api')->group(function () {
        Route::get('/config', [AdminRegistrationController::class, 'getConfig']);
        Route::put('/config', [AdminRegistrationController::class, 'updateConfig']);
        Route::get('/registrations', [AdminRegistrationController::class, 'listRegistrations']);
        Route::get('/registrations/{id}', [AdminRegistrationController::class, 'getRegistration']);
        Route::post('/registrations/{id}/approve', [AdminRegistrationController::class, 'approveRegistration']);
        Route::post('/registrations/{id}/reject', [AdminRegistrationController::class, 'rejectRegistration']);
    });

    Route::prefix('/member-registration')->group(function () {
        Route::get('/config', [MemberRegistrationController::class, 'getConfig']);
        Route::post('/register', [MemberRegistrationController::class, 'register']);
        Route::post('/initiate-payment', [MemberRegistrationController::class, 'initiatePayment'])->middleware('auth.jwt', 'throttle:api');
        Route::get('/status/{id}', [MemberRegistrationController::class, 'getStatus']);
    });

    Route::post('/bank-statement-import', [ImportController::class, 'importBankStatement'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/bulk-import', [ImportController::class, 'bulkImport'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/create-member', [MemberController::class, 'createMember'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/operational-topup', [OperationalTopupController::class, 'topup'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/ai-assistant', [AiAssistantController::class, 'query'])->middleware('auth.jwt', 'throttle:api');
    Route::post('/b2c-transfer', [B2cTransferController::class, 'transfer'])->middleware('auth.jwt', 'throttle:api');

    Route::post('/rpc/{fn}', [\App\Http\Controllers\Api\RpcController::class, 'handle'])->middleware('auth.jwt', 'throttle:api');
});

Route::prefix('/members')->middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::get('/stats', [MemberStatsController::class, 'index']);
    Route::get('/stats/summary', [MemberStatsController::class, 'summary']);
    Route::get('/stats/statement', [MemberStatsController::class, 'statement']);
});

Route::prefix('/admin/presence')->middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::get('/online-users', [\App\Http\Controllers\Api\PresenceController::class, 'onlineUsers']);
    Route::get('/login-activity', [\App\Http\Controllers\Api\PresenceController::class, 'loginActivity']);
});

// --- Signatures (master engineering 2026-09-04) ---
Route::prefix('/signatures')->middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::get('/', [SignatureController::class, 'index']);
    Route::get('/current', [SignatureController::class, 'current']);
    Route::post('/', [SignatureController::class, 'store']);
    Route::delete('/{id}', [SignatureController::class, 'destroy']);
});

// --- Minutes (master engineering 2026-09-04) ---
Route::prefix('/minutes')->middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::get('/', [MeetingMinutesController::class, 'index']);
    Route::get('/executive-members', [MeetingMinutesController::class, 'executiveMembers']);
    Route::post('/', [MeetingMinutesController::class, 'store']);
    Route::get('/{id}', [MeetingMinutesController::class, 'show']);
    Route::put('/{id}', [MeetingMinutesController::class, 'update']);
    Route::post('/{id}/submit', [MeetingMinutesController::class, 'submit']);
    Route::post('/{id}/approve', [MeetingMinutesController::class, 'approve']);
    Route::post('/{id}/reject', [MeetingMinutesController::class, 'reject']);
});

// --- Bulk SMS (master engineering 2026-09-04) ---
Route::prefix('/bulk-sms')->middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::get('/recipients', [BulkSmsController::class, 'recipients']);
    Route::post('/dry-run', [BulkSmsController::class, 'dryRun']);
    Route::post('/send', [BulkSmsController::class, 'send']);
});

// --- Super Admin stats (master engineering 2026-09-04) ---
Route::prefix('/super-admin')->middleware(['auth.jwt', 'throttle:api'])->group(function () {
    Route::get('/stats', [SuperAdminStatsController::class, 'dashboard']);
    Route::get('/health', [SuperAdminStatsController::class, 'health']);
});

