<?php

namespace interfaces;

use Exception;

interface motorapi_i
{
    /**
     * Get license plate information from the motorapi
     * @param string $licensePlate The license plate to get information about (e.g. "AB12345")
     * @param bool $ignoreCache Whether to ignore the cache or not. If true, the cache will be ignored and the request will be sent to the motorapi directly.
     * @return object The license plate information
     */
    function getLicensePlateInformation(string $licensePlate, bool $ignoreCache = true): object;

    /**
     * Get the daily request counter
     * @return int The daily request counter
     */
    function getDailyRequestCounter(): int;

    /**
     * Send a request to the motorapi
     * @param string $licensePlate The license plate to get information about (e.g. "AB12345")
     * @param string $endpoint The endpoint to send the request to (e.g. "vehicle")
     * @param array $data The data to send with the request (e.g. ["key" => "value"])
     * @param string $method The method to use for the request (e.g. "GET")
     * @return object The response from the motorapi
     */
    function sendRequest(string $licensePlate, string $endpoint, array $data, string $method): object;

    /**
     * Require the module to be enabled
     * @return void
     * @throws Exception If the module is not enabled
     */
    function requireModuleEnabled(): void;

    /**
     * Require the license plate to be valid
     * @param string $licensePlate The license plate to validate
     * @return void
     * @throws Exception If the license plate is not valid
     */
    function requireValidLicensePlate(string $licensePlate): void;

    /**
     * Require the daily limit to not be exceeded
     * @return void
     * @throws Exception If the daily limit is exceeded
     */
    function requireDailyLimitNotExceeded(): void;

    /**
     * Require the secret key to be valid
     * @return void
     * @throws Exception If the secret key is not valid
     */
    function requireValidSecretKey(): void;

    /**
     * Send a GET request to the motorapi
     * @param string $licensePlate The license plate to get information about
     * @param string $endpoint The endpoint to send the request to
     * @param array $data The data to send with the request
     * @return object The response from the motorapi
     */
    function sendGetRequest(string $licensePlate, string $endpoint, array $data): object;

    /**
     * Send a POST request to the motorapi
     * @param string $licensePlate The license plate to get information about
     * @param string $endpoint The endpoint to send the request to
     * @param array $data The data to send with the request
     * @return object The response from the motorapi
     */
    function sendPostRequest(string $licensePlate, string $endpoint, array $data): object;

    /**
     * Send a PUT request to the motorapi
     * @param string $licensePlate The license plate to get information about
     * @param string $endpoint The endpoint to send the request to
     * @param array $data The data to send with the request
     * @return object The response from the motorapi
     */
    function sendPutRequest(string $licensePlate, string $endpoint, array $data): object;

    /**
     * Send a DELETE request to the motorapi
     * @param string $licensePlate The license plate to get information about
     * @param string $endpoint The endpoint to send the request to
     * @param array $data The data to send with the request
     * @return object The response from the motorapi
     */
    function sendDeleteRequest(string $licensePlate, string $endpoint, array $data): object;

    /**
     * Add a request to the log
     * @param string $licensePlate The license plate to get information about
     * @param string $endpoint The endpoint to send the request to
     * @param object $response The response from the motorapi
     * @return void
     */
    function addRequestToLog(string $licensePlate, string $endpoint, object $response): void;

    /**
     * Check if a license plate response is stored in the log/local database/cache
     * @param string $licensePlate The license plate to check
     * @return bool Whether the license plate response is stored in the log/local database/cache
     * @throws Exception If the license plate is not valid
     */
    function isCached(string $licensePlate): bool;

    /**
     * Get the cached response for a license plate
     * @param string $licensePlate The license plate to get the cached response for
     * @return object|null The (latest) cached response for the license plate
     * @throws Exception If the license plate is not valid or the response is not cached
     */
    function getCachedResult(string $licensePlate): ?object;
}