<?php

namespace routes;

use classes\authentication;
use classes\motorapi;
use Exception;
use objects\logs_o;
use objects\motorapi_lookups_o;
use objects\orders_o;
use traits\route_t;

class vehicleProductSuggestionRoute
{
    use route_t;

    public function run(): void
    {
        $this->get(
            '/vehicle/product-suggestions',
            function () {
                // Require the user to be logged in
                global $response;
                $this->requirePermission('vehicle_product_suggestions');
                // Get the user object
                $user = (new authentication())->get_user();
                // Check if the request was successful
                if ($user) {
                    // Make sure the vehicle plate(s) is provided
                    $reg_1 = null; $reg_2 = null; $reg_3 = null;
                    foreach (['reg_1', 'reg_2', 'reg_3'] as $key) {
                        if ($this->isParametersSet([$key])) {
                            ${$key} = (string)$this->fromRequest($key);
                            self::requireType(${$key}, self::type_string());
                            self::requireMinLength($key, 1);
                            self::requireMaxLength($key, 10);
                        }
                    }
                    if (!$reg_1 && !$reg_2 && !$reg_3) {
                        $response->error('At least one vehicle plate must be provided', 400);
                    }
                    // Check if the vehicle has been previously added to an order.
                    // Check if the vehicle has been previously looked up.


                } else {
                    // Log the incident
                    (new logs_o())->add('products', 'global', 1, 0, 'FETCH_VEHICLE_PRODUCT_SUGGESTIONS', 'No user found, or invalid session');
                    // Return an error
                    $response->error('Invalid session', 400);
                }
            },
            [
                'vehicle_product_suggestions' => 'Access to vehicle product suggestions based on internal and external data',
            ]
        );
    }

    /**
     *
     * @throws Exception If the MotorAPI request fails, if the registration is invalid, or if the response is malformed
     */
    protected function getVehicleMotorAPIValue(string $reg): ?object
    {
        // Get the MotorAPI response for the vehicle reg
        $MotorAPI = new motorapi();
        return $MotorAPI->getLicensePlateInformation($reg, false);
    }

    protected function getSimilarVehicles(array $values): array
    {
        $tmp_result = (new motorapi_lookups_o())->getCachedResultsBySubstring($values);
        return array_map(
            function ($item) {
                return $item->result->value();
            },
            $tmp_result
        );
    }
}