<?php

namespace routes;

use classes\authentication;
use objects\logs_o;
use objects\orders_o;
use traits\route_t;

class vehiclePlateLookupRoute
{
    use route_t;

    public function run(): void
    {
        $this->get(
            '/department/license-plate/lookup',
            function () {
                // Require the user to be logged in
                global $response;
                $this->requirePermission('department_license_plate_lookup');
                // Get the user object
                $user = (new authentication())->get_user();
                // Check if the request was successful
                if ($user) {
                    // Make sure the vehicle plate is set
                    if (!(string)$this->fromRequest('plate')) {
                        $response->error('Plate parameter is required', 400);
                    }
                    // Return the vehicle order history
                    $response->success(
                        (new orders_o())->get_vehicle_order_history($this->fromRequest('plate'))
                    );
                } else {
                    // Log the incident
                    (new logs_o())->add('orders', 'global', 1, 0, 'FETCH_VEHICLE_ORDER_HISTORY', 'No user found, or invalid session');
                    // Return an error
                    $response->error('Invalid session', 400);
                }
            },
            [
                'department_license_plate_lookup' => 'Departmental access to lookup a license plate and view the order history'
            ]
        );

        $this->get('/department/license-plate/customer-lookup', function () {
            // Require the user to be logged in
            global $response;
            self::requirePermission('department_license_plate_lookup');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Make sure the vehicle plate is set
                self::requireParameters(['plate', 'customer_number', 'column']);
                self::requireType((string)self::getParameter('plate'), 'string');
                self::requireType((int)self::getParameter('customer_number'), self::type_int());
                self::requireType((string)self::getParameter('column'), 'string');
                self::requireMinLength('customer_number', 1);
                self::requireMaxLength('customer_number', 10);
                self::requireMinLength('plate', 0);
                self::requireMaxLength('plate', 10);
                // Make sure the column is allowed
                $allowedColumns = ['reg_1', 'reg_2', 'reg_3'];
                if (!in_array((string)self::getParameter('column'), $allowedColumns)) {
                    $response->error('Invalid column, allowed columns are: ' . implode(', ', $allowedColumns), 400);
                }
                // Return the vehicle order history
                $response->success(
                    (new orders_o())
                        ->setSearchableFields(['customer_id', (string)self::getParameter('column'), 'created_at'])
                        ->listObjectsWithPagination(
                            1,
                            10,
                            (string)self::getParameter('plate'),
                            ['customer_id' => self::getParameter('customer_number')],
                            ['created_at' => 'DESC'],
                            function ($order) {
                                return [
                                    'registration_number' => $order[(string)self::getParameter('column')], // Get the registration number
                                ];
                            }
                        )
                );
            } else {
                // Log the incident
                (new logs_o())->add('orders', 'global', 1, 0, 'FETCH_VEHICLE_ORDER_HISTORY', 'No user found, or invalid session');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'department_license_plate_lookup' => 'List all the records for a specific customer number and registration number column in the orders table'
            ]
        );
    }
}