<?php

declare(strict_types=1);

namespace App\Framework\Discovery\Analysis;

use App\Framework\Discovery\ValueObjects\DependencyGraph;

final readonly class DependencyAnalysisResult
{
    /**
     * @param array<array<string>> $circularDependencies
     * @param array<string, mixed> $statistics
     */
    public function __construct(
        private DependencyGraph $graph,
        private array $circularDependencies,
        private array $statistics
    ) {
    }

    /**
     * Get the dependency graph
     */
    public function getGraph(): DependencyGraph
    {
        return $this->graph;
    }

    /**
     * Get circular dependencies
     *
     * @return array<array<string>>
     */
    public function getCircularDependencies(): array
    {
        return $this->circularDependencies;
    }

    /**
     * Get analysis statistics
     *
     * @return array<string, mixed>
     */
    public function getStatistics(): array
    {
        return $this->statistics;
    }

    /**
     * Check if there are any circular dependencies
     */
    public function hasCircularDependencies(): bool
    {
        return ! empty($this->circularDependencies);
    }

    /**
     * Get the number of circular dependency cycles
     */
    public function getCircularDependencyCount(): int
    {
        return count($this->circularDependencies);
    }

    /**
     * Convert to array for serialization
     *
     * @return array<string, mixed>
     */
    public function toArray(): array
    {
        return [
            'statistics' => $this->statistics,
            'circular_dependencies' => $this->circularDependencies,
            'has_circular_dependencies' => $this->hasCircularDependencies(),
            'circular_dependency_count' => $this->getCircularDependencyCount(),
            'graph' => $this->graph->toArray(),
        ];
    }
}
