<?php

namespace App\Services\Providers;

use App\Models\ProviderConnection;
use App\Services\Graph\GraphResponse;
use App\Services\Providers\Contracts\ProviderInventoryCollector;
use RuntimeException;

final class MicrosoftProviderInventoryCollector implements ProviderInventoryCollector
{
    /**
     * @var array<int, string>
     */
    private array $policyTypes = [
        'deviceConfiguration',
        'settingsCatalogPolicy',
        'groupPolicyConfiguration',
    ];

    public function __construct(private readonly ProviderGateway $gateway) {}

    public function collect(ProviderConnection $connection): array
    {
        $total = 0;

        foreach ($this->policyTypes as $policyType) {
            $response = $this->gateway->listPolicies($connection, $policyType);

            if ($response->failed()) {
                $message = $this->messageForResponse($response);
                $status = (int) ($response->status ?? 0);

                throw new RuntimeException("Graph request failed for {$policyType} (status {$status}): {$message}");
            }

            $items = is_array($response->data) ? $response->data : [];
            $total += count($items);
        }

        return [
            'total' => $total,
            'items' => $total,
        ];
    }

    private function messageForResponse(GraphResponse $response): string
    {
        $error = $response->errors[0] ?? null;

        if (is_string($error)) {
            return $error;
        }

        if (is_array($error)) {
            $message = $error['message'] ?? null;

            if (is_string($message) && $message !== '') {
                return $message;
            }

            return json_encode($error, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?: 'Request failed.';
        }

        return 'Request failed.';
    }
}
