<?php

namespace MintyPHP\Console\Commands;

use MintyPHP\Console\Command;
use MintyPHP\Console\Runner\Doctor\DoctorRunner;
use MintyPHP\Console\Runner\Doctor\DoctorRunnerInterface;

final class DoctorCommand extends Command
{
    private ?DoctorRunnerInterface $runner;

    public function __construct(?DoctorRunnerInterface $runner = null)
    {
        $this->runner = $runner;
    }

    public function name(): string
    {
        return 'doctor';
    }

    public function description(): string
    {
        return 'Run system health checks';
    }

    public function usage(): string
    {
        return <<<'USAGE'
        Usage: php bin/console doctor [--format=json]

        Options:
          --format=json    Output stable JSON for automation
        USAGE;
    }

    public function execute(array $args, array $options): int
    {
        $format = strtolower((string) ($options['format'] ?? 'human'));
        if (!in_array($format, ['human', 'json'], true)) {
            fwrite(STDERR, "Invalid format '{$format}'. Supported: human, json\n");
            return 1;
        }

        $result = $this->runner()->run();

        if ($format === 'json') {
            echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL;
            return (int) $result['exit_code'];
        }

        echo "Minty Doctor Report\n";
        echo "===================\n";
        foreach ($result['checks'] as $item) {
            echo sprintf(
                "[%s] %s: %s\n",
                strtoupper($item['status']),
                $item['name'],
                $item['message']
            );
        }
        echo sprintf(
            "\nSummary: ok=%d warn=%d fail=%d\n",
            $result['ok_count'],
            $result['warn_count'],
            $result['fail_count']
        );

        return (int) $result['exit_code'];
    }

    private function runner(): DoctorRunnerInterface
    {
        if ($this->runner instanceof DoctorRunnerInterface) {
            return $this->runner;
        }

        $this->runner = new DoctorRunner();
        return $this->runner;
    }
}
