<?php

namespace MintyPHP\Http\Input;

final class RequestInputFactory
{
    /** @var array<string, mixed>|null */
    private ?array $cachedApiBody = null;

    public function create(): RequestInput
    {
        $method = strtoupper(trim((string) ($_SERVER['REQUEST_METHOD'] ?? 'GET')));
        if ($method === '') {
            $method = 'GET';
        }

        $query = $_GET;
        $files = $_FILES;

        // API requests carry a JSON body; web requests use $_POST form data.
        if (defined('MINTY_API_REQUEST')) {
            return new RequestInput($method, $query, $this->readApiBody(), $files);
        }

        $body = $_POST;
        return new RequestInput($method, $query, $body, $files);
    }

    /**
     * @return array<string, mixed>
     */
    private function readApiBody(): array
    {
        if ($this->cachedApiBody !== null) {
            return $this->cachedApiBody;
        }

        $raw = file_get_contents('php://input');
        if (!is_string($raw) || $raw === '') {
            $this->cachedApiBody = [];
            return $this->cachedApiBody;
        }

        $decoded = json_decode($raw, true);
        $this->cachedApiBody = is_array($decoded) ? $decoded : [];
        return $this->cachedApiBody;
    }
}
