<?php

use App\Http\Controllers\Api\Pwa\ApprovalController;
use App\Http\Controllers\Api\Pwa\AuthController;
use App\Http\Controllers\Api\Pwa\ClientController;
use App\Http\Controllers\Api\Pwa\CollectionController;
use App\Http\Controllers\Api\Pwa\CollectionVisitController;
use App\Http\Controllers\Api\Pwa\CreditController;
use App\Http\Controllers\Api\Pwa\DashboardController;
use App\Http\Controllers\Api\Pwa\DelinquencyController;
use App\Http\Controllers\Api\Pwa\ExpenseController;
use App\Http\Controllers\Api\Pwa\FinancialController;
use App\Http\Controllers\Api\Pwa\PartnerController;
use App\Http\Controllers\Api\Pwa\PaymentController;
use App\Http\Controllers\Api\Pwa\SettingsController;
use App\Http\Controllers\Api\Pwa\SupervisorTeamController;
use App\Http\Controllers\Api\Pwa\SyncController;
use App\Http\Controllers\Api\Pwa\TeamController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
*/

Route::middleware(['auth:sanctum'])->get('/user', function (Request $request) {
    return $request->user();
});

/*
|--------------------------------------------------------------------------
| PWA API Routes - Credify GO!
|--------------------------------------------------------------------------
|
| Rutas para la PWA multi-rol.
| Todas las rutas (excepto login) requieren:
| - Autenticacion via Sanctum
| - Rol: collector, supervisor, o admin
| - Company con suscripcion activa
|
*/

Route::prefix('pwa')->name('pwa.')->group(function () {

    // ═══════════════════════════════════════════════════════════════════
    // AUTENTICACION (publicas)
    // ═══════════════════════════════════════════════════════════════════
    Route::post('/auth/login', [AuthController::class, 'login'])
        ->middleware('throttle:pwa-login')
        ->name('auth.login');

    // ═══════════════════════════════════════════════════════════════════
    // RUTAS PROTEGIDAS (requieren auth + rol pwa: collector/supervisor/admin)
    // ═══════════════════════════════════════════════════════════════════
    Route::middleware(['auth:sanctum', 'pwa.access'])->group(function () {

        // ───────────────────────────────────────────────────────────────
        // Auth (protegidas)
        // ───────────────────────────────────────────────────────────────
        Route::post('/auth/logout', [AuthController::class, 'logout'])
            ->name('auth.logout');

        Route::get('/auth/me', [AuthController::class, 'me'])
            ->name('auth.me');

        Route::post('/auth/register-device', [AuthController::class, 'registerDevice'])
            ->name('auth.register-device');

        Route::get('/auth/devices', [AuthController::class, 'devices'])
            ->name('auth.devices');

        Route::delete('/auth/devices/{tokenId}', [AuthController::class, 'revokeDevice'])
            ->name('auth.revoke-device');

        // ───────────────────────────────────────────────────────────────
        // Settings (Company configuration for PWA)
        // ───────────────────────────────────────────────────────────────
        Route::get('/settings', [SettingsController::class, 'index'])
            ->name('settings.index');

        Route::get('/settings/simplified-input', [SettingsController::class, 'simplifiedInput'])
            ->name('settings.simplified-input');

        Route::put('/settings', [SettingsController::class, 'update'])
            ->name('settings.update');

        Route::post('/settings/convert-amount', [SettingsController::class, 'convertAmount'])
            ->name('settings.convert-amount');

        // ───────────────────────────────────────────────────────────────
        // Dashboard
        // ───────────────────────────────────────────────────────────────
        Route::get('/dashboard', [DashboardController::class, 'index'])
            ->name('dashboard');

        Route::get('/dashboard/summary', [DashboardController::class, 'summary'])
            ->name('dashboard.summary');

        Route::get('/dashboard/weekly-progress', [DashboardController::class, 'weeklyProgress'])
            ->name('dashboard.weekly-progress');

        Route::get('/dashboard/recent-payments', [DashboardController::class, 'recentPayments'])
            ->name('dashboard.recent-payments');

        Route::get('/dashboard/pending-collections', [DashboardController::class, 'pendingCollections'])
            ->name('dashboard.pending-collections');

        // ───────────────────────────────────────────────────────────────
        // Collectors (solo supervisor/admin)
        // ───────────────────────────────────────────────────────────────
        Route::get('/collectors', [DashboardController::class, 'collectors'])
            ->name('collectors.index');

        // ───────────────────────────────────────────────────────────────
        // Team (supervisor/admin — métricas del equipo de cobradores)
        // ───────────────────────────────────────────────────────────────
        Route::get('/team', [TeamController::class, 'index'])
            ->name('team.index');

        // ───────────────────────────────────────────────────────────────
        // Team management (admin — asignación supervisor ↔ collector)
        // ───────────────────────────────────────────────────────────────
        Route::get('/team/collectors', [SupervisorTeamController::class, 'collectors'])
            ->name('team.collectors');

        Route::post('/team/supervisors/{supervisorId}/collectors', [SupervisorTeamController::class, 'assignCollector'])
            ->middleware('throttle:pwa-write')
            ->name('team.supervisors.assign')
            ->whereNumber('supervisorId');

        Route::delete('/team/supervisors/{supervisorId}/collectors/{collectorId}', [SupervisorTeamController::class, 'unassignCollector'])
            ->middleware('throttle:pwa-write')
            ->name('team.supervisors.unassign')
            ->whereNumber('supervisorId')
            ->whereNumber('collectorId');

        Route::patch('/team/supervisors/{supervisorId}', [SupervisorTeamController::class, 'updateSupervisor'])
            ->middleware('throttle:pwa-write')
            ->name('team.supervisors.update')
            ->whereNumber('supervisorId');

        // ───────────────────────────────────────────────────────────────
        // Approvals (supervisor/admin — operaciones pendientes de aprobación)
        // ───────────────────────────────────────────────────────────────
        Route::get('/approvals/pending', [ApprovalController::class, 'pendingOperations'])
            ->name('approvals.pending');

        Route::post('/approvals/{id}/approve', [ApprovalController::class, 'approve'])
            ->middleware('throttle:pwa-write')
            ->name('approvals.approve')
            ->whereNumber('id');

        Route::post('/approvals/{id}/reject', [ApprovalController::class, 'reject'])
            ->middleware('throttle:pwa-write')
            ->name('approvals.reject')
            ->whereNumber('id');

        // ───────────────────────────────────────────────────────────────
        // Delinquency (supervisor/admin — reportes de morosidad)
        // ───────────────────────────────────────────────────────────────
        Route::get('/delinquency', [DelinquencyController::class, 'index'])
            ->name('delinquency.index');
        Route::get('/delinquency/aging/{bucket}', [DelinquencyController::class, 'agingBucket'])
            ->name('delinquency.aging_bucket');

        // ───────────────────────────────────────────────────────────────
        // Financials (admin — flujo de caja y movimientos contables)
        // ───────────────────────────────────────────────────────────────
        Route::get('/financials', [FinancialController::class, 'index'])
            ->name('financials.index');

        // ───────────────────────────────────────────────────────────────
        // Expenses (todos los roles — registrar gastos operativos)
        // ───────────────────────────────────────────────────────────────
        Route::post('/expenses', [ExpenseController::class, 'store'])
            ->middleware('throttle:pwa-write')
            ->name('expenses.store');

        Route::get('/expenses/categories', [ExpenseController::class, 'categories'])
            ->name('expenses.categories');

        // Los gastos de quien pregunta. El desglose de /pwa/financials es solo
        // de admin, así que el cobrador registraba un gasto y perdía el rastro.
        Route::get('/expenses/mine', [ExpenseController::class, 'mine'])
            ->name('expenses.mine');

        // ───────────────────────────────────────────────────────────────
        // Partners (admin — socios e inversionistas)
        // ───────────────────────────────────────────────────────────────
        Route::get('/partners', [PartnerController::class, 'index'])
            ->name('partners.index');

        Route::post('/partners/{id}/transaction', [PartnerController::class, 'storeTransaction'])
            ->middleware('throttle:pwa-write')
            ->name('partners.transaction')
            ->whereNumber('id');

        // ───────────────────────────────────────────────────────────────
        // Collections (Cuotas a cobrar)
        // ───────────────────────────────────────────────────────────────
        Route::get('/collections', [CollectionController::class, 'index'])
            ->name('collections.index');

        Route::get('/collections/stats', [CollectionController::class, 'stats'])
            ->name('collections.stats');

        // ───────────────────────────────────────────────────────────────
        // Clients (filtrado por rol)
        // ───────────────────────────────────────────────────────────────
        Route::get('/clients', [ClientController::class, 'index'])
            ->name('clients.index');

        Route::post('/clients', [ClientController::class, 'store'])
            ->middleware('throttle:pwa-write')
            ->name('clients.store');

        Route::put('/clients/{id}', [ClientController::class, 'update'])
            ->middleware('throttle:pwa-write')
            ->name('clients.update')
            ->whereNumber('id');

        Route::get('/clients/{id}', [ClientController::class, 'show'])
            ->name('clients.show')
            ->whereNumber('id');

        // ───────────────────────────────────────────────────────────────
        // Locations (Departamentos y Ciudades)
        // ───────────────────────────────────────────────────────────────
        Route::get('/locations/departments', [ClientController::class, 'departments'])
            ->name('locations.departments');

        Route::get('/locations/cities', [ClientController::class, 'cities'])
            ->name('locations.cities');

        // ───────────────────────────────────────────────────────────────
        // Credits (Solo asignados al collector)
        // ───────────────────────────────────────────────────────────────
        Route::get('/credits', [CreditController::class, 'index'])
            ->name('credits.index');

        Route::post('/credits', [CreditController::class, 'store'])
            ->middleware('throttle:pwa-write')
            ->name('credits.store');

        Route::get('/credits/collectors', [CreditController::class, 'collectors'])
            ->name('credits.collectors');

        // Fecha de la primera cuota ANTES de crear el crédito. Va al servidor a
        // propósito: el formulario la calculaba por su cuenta y no coincidía con
        // la que luego se creaba. Aquí la responde quien manda de verdad.
        Route::get('/credits/primera-cuota', [CreditController::class, 'primeraCuota'])
            ->name('credits.primera-cuota');

        Route::get('/credits/{id}', [CreditController::class, 'show'])
            ->name('credits.show')
            ->whereNumber('id');

        Route::get('/credits/{id}/payments', [CreditController::class, 'payments'])
            ->name('credits.payments')
            ->whereNumber('id');

        Route::get('/credits/order', [CreditController::class, 'order'])
            ->name('credits.order');

        Route::put('/credits/reorder', [CreditController::class, 'reorder'])
            ->middleware('throttle:pwa-write')
            ->name('credits.reorder');

        // ───────────────────────────────────────────────────────────────
        // Payments
        // ───────────────────────────────────────────────────────────────
        Route::post('/payments', [PaymentController::class, 'store'])
            ->middleware('throttle:pwa-write')
            ->name('payments.store');

        Route::post('/payments/{id}/void', [PaymentController::class, 'void'])
            ->middleware('throttle:pwa-write')
            ->name('payments.void')
            ->whereNumber('id');

        Route::get('/payments/today', [PaymentController::class, 'today'])
            ->name('payments.today');

        Route::get('/payments/{id}', [PaymentController::class, 'show'])
            ->name('payments.show')
            ->whereNumber('id');

        Route::get('/payments/{id}/receipt', [PaymentController::class, 'receipt'])
            ->name('payments.receipt')
            ->whereNumber('id');

        // ───────────────────────────────────────────────────────────────
        // Collection Visits (No paga hoy)
        // ───────────────────────────────────────────────────────────────
        Route::post('/visits', [CollectionVisitController::class, 'store'])
            ->middleware('throttle:pwa-write')
            ->name('visits.store');

        Route::get('/visits/today', [CollectionVisitController::class, 'today'])
            ->name('visits.today');

        // ───────────────────────────────────────────────────────────────
        // Sync (Sincronización offline)
        // ───────────────────────────────────────────────────────────────
        Route::post('/sync/payments', [SyncController::class, 'syncPayments'])
            ->middleware('throttle:pwa-write')
            ->name('sync.payments');

        Route::post('/sync/visits', [SyncController::class, 'syncVisits'])
            ->middleware('throttle:pwa-write')
            ->name('sync.visits');

        Route::post('/sync/expenses', [SyncController::class, 'syncExpenses'])
            ->middleware('throttle:pwa-write')
            ->name('sync.expenses');

        Route::get('/sync/data', [SyncController::class, 'downloadData'])
            ->name('sync.data');

        Route::get('/sync/check', [SyncController::class, 'checkUpdates'])
            ->name('sync.check');

    });
});
