<?php

/**
 * Copyright 2024-2025 Simply.IN Sp. z o.o.
 *
 * NOTICE OF LICENSE
 *
 * Licensed under the EUPL-1.2 or later.
 * You may not use this work except in compliance with the Licence.
 *
 * Copy of the Licence is available at:
 * https://joinup.ec.europa.eu/software/page/eupl
 * It is bundled with this package in the file LICENSE.txt
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the Licence is distributed on an as is basis,
 * without warranties or conditions of any kind, either express or implied.
 * Check the Licence for the specific language governing permissions
 * and limitations under the License.
 *
 * @author   Simply.IN Sp. z o.o.
 * @copyright 2024-2025 Simply.IN Sp. z o.o.
 * @license   https://joinup.ec.europa.eu/software/page/eupl
 */

declare(strict_types=1);

namespace SimplyIn\Ajax;

use Tools;

if (!defined('_PS_VERSION_')) {
    exit;
}

final class AjaxRequest
{
    /**
     * @param array<string, mixed> $overrides
     */
    public function __construct(private readonly array $overrides = [])
    {
    }

    public function get(string $key, mixed $default = null): mixed
    {
        if (array_key_exists($key, $this->overrides)) {
            return $this->overrides[$key];
        }

        $value = Tools::getValue($key, $default);

        return $value === false && $default !== null ? $default : $value;
    }

    public function has(string $key): bool
    {
        if (array_key_exists($key, $this->overrides)) {
            return $this->overrides[$key] !== null && $this->overrides[$key] !== '';
        }

        return Tools::getIsset($key);
    }

    public function getString(string $key, string $default = ''): string
    {
        $value = $this->get($key, $default);

        return is_scalar($value) ? (string) $value : $default;
    }

    public function getInt(string $key, int $default = 0): int
    {
        $value = $this->get($key, $default);

        return is_numeric($value) ? (int) $value : $default;
    }

    public function getBool(string $key): bool
    {
        return (bool) $this->get($key, false);
    }

    /**
     * @return array<string, mixed>
     */
    public function getArray(string $key): array
    {
        $value = $this->get($key, []);
        if (!is_array($value)) {
            return [];
        }
        $result = [];
        foreach ($value as $k => $v) {
            $result[(string) $k] = $v;
        }

        return $result;
    }
}
