<?php

use App\Services\AgedReceivableOrdersService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('/aged-receivables', function (AgedReceivableOrdersService $service) {
    return response()->json($service->fetchClients());
})->name('api.aged-receivables');

Route::get('/orders/lookup', function (Request $request, AgedReceivableOrdersService $service) {
    if ($request->filled('order_id')) {
        $found = $service->findOrderByOrderId((string) $request->query('order_id'));
    } elseif ($request->filled('record_id')) {
        $found = $service->findOrderByRecordId((string) $request->query('record_id'));
    } else {
        return response()->json(['message' => 'Provide order_id or record_id query parameter.'], 422);
    }

    return $found
        ? response()->json(['clientName' => $found['clientName'], 'order' => $found['order']])
        : response()->json(['message' => 'Order not found'], 404);
})->name('api.orders.lookup');

// Public BDB status API for Claude/automation (proxies to BDB CodeIgniter API)
Route::middleware(['throttle:60,1'])->group(function () {
    Route::match(['get', 'post'], '/getOrdersByStatus', function (Request $request, AgedReceivableOrdersService $service) {
        $query = $request->validate([
            'status' => ['nullable', 'string', 'max:255'],
            'statusName' => ['nullable', 'string', 'max:255'],
            'statusID' => ['nullable', 'regex:/^\d+(,\d+)*$/'],
            'orderStatus' => ['nullable', 'regex:/^\d+(,\d+)*$/'],
            'limit' => ['nullable', 'integer', 'min:1', 'max:5000'],
        ]);

        if (! $request->filled('status')
            && ! $request->filled('statusName')
            && ! $request->filled('statusID')
            && ! $request->filled('orderStatus')) {
            return response()->json([
                'success' => false,
                'error' => 'Provide status/statusName or statusID/orderStatus.',
            ], 422);
        }

        return $service->relayBdbResponse($service->fetchOrdersByStatus($query));
    })->name('api.bdb.orders-by-status');

    // Public Work In Progress JSON API (proxies to BDB /api_work_progress)
// CORS is scoped to this route only so payment pages / other APIs are unaffected.

Route::options('/work-progress', function (AgedReceivableOrdersService $service) {
    return $service->withWorkProgressCors(response()->noContent());
});

Route::options('/work-progress/ping', function (AgedReceivableOrdersService $service) {
    return $service->withWorkProgressCors(response()->noContent());
});

// Fast health check for browser/CORS status pages (does not call upstream WIP).
Route::get('/work-progress/ping', function (AgedReceivableOrdersService $service) {
    return $service->withWorkProgressCors(response()->json([
        'success' => true,
        'ok' => true,
        'endpoint' => '/api/work-progress',
        'message' => 'WIP API is reachable. Full report may take 10-30 seconds.',
    ]));
})->name('api.work-progress.ping');

Route::middleware(['throttle:30,1'])->group(function () {
    Route::match(['get', 'post'], '/work-progress', function (Request $request, AgedReceivableOrdersService $service) {
        $params = $request->validate([
            'companyID' => ['nullable', 'regex:/^\d+$/'],
            'page' => ['nullable', 'integer', 'min:0'],
            'orderID' => ['nullable', 'integer', 'min:1'],
        ]);

        return $service->withWorkProgressCors(
            $service->relayBdbResponse($service->fetchWorkProgress($params))
        );
    })->name('api.work-progress');
});
    Route::match(['get', 'post'], '/getActiveOrderStatuses', function (Request $request, AgedReceivableOrdersService $service) {
        $query = $request->validate([
            'format' => ['nullable', 'in:json,csv'],
        ]);
        $csv = ($query['format'] ?? '') === 'csv';

        return $service->relayBdbResponse(
            $service->fetchActiveOrderStatuses($query),
            $csv
        );
    })->name('api.bdb.active-statuses');

    Route::post('/updateOrderStatus', function (Request $request, AgedReceivableOrdersService $service) {
        $payload = $request->validate([
            'orderID' => ['nullable', 'integer', 'min:1'],
            'orderNumber' => ['nullable', 'string', 'max:100'],
            'InvoiceNumber' => ['nullable', 'string', 'max:100'],
            'invoiceNumber' => ['nullable', 'string', 'max:100'],
            'recordID' => ['nullable', 'string', 'max:100'],
            'pref_1515' => ['nullable', 'string', 'max:100'],
            'status' => ['nullable', 'string', 'max:255'],
            'statusName' => ['nullable', 'string', 'max:255'],
            'statusID' => ['nullable', 'integer', 'min:1'],
            'orderStatus' => ['nullable', 'integer', 'min:1'],
            'message' => ['nullable', 'string', 'max:2000'],
        ]);

        $hasOrder = $request->filled('orderID')
            || $request->filled('orderNumber')
            || $request->filled('InvoiceNumber')
            || $request->filled('invoiceNumber')
            || $request->filled('recordID')
            || $request->filled('pref_1515');
        $hasStatus = $request->filled('status')
            || $request->filled('statusName')
            || $request->filled('statusID')
            || $request->filled('orderStatus');

        if (! $hasOrder || ! $hasStatus) {
            return response()->json([
                'success' => false,
                'error' => 'Provide an order lookup and target status.',
            ], 422);
        }

        if (! isset($payload['status']) && isset($payload['statusName'])) {
            $payload['status'] = $payload['statusName'];
            unset($payload['statusName']);
        }

        return $service->relayBdbResponse($service->updateBdbOrderStatus($payload));
    })->name('api.bdb.update-status');
});
