<?php

namespace MintyPHP\Console;

use MintyPHP\Console\Support\CliAppBootstrap;

/**
 * Base class for CLI commands.
 *
 * Subclasses define a name (e.g. 'module:sync') and implement execute().
 * Bootstrap helpers provide a stable way to initialize the app without
 * fragile relative paths.
 */
abstract class Command
{
    abstract public function name(): string;

    abstract public function description(): string;

    /**
     * Optional usage text shown when --help is passed for this command.
     * Override in subclasses that accept arguments or options.
     */
    public function usage(): string
    {
        return '';
    }

    /**
     * @param list<string> $args Positional arguments (after the command name)
     * @param array<string, string|bool> $options Parsed --key=value and --flag options
     * @return int Exit code (0 = success)
     */
    abstract public function execute(array $args, array $options): int;

    // ─── Bootstrap helpers ──────────────────────────────────────────

    protected function projectRoot(): string
    {
        return dirname(__DIR__, 2);
    }

    /**
     * Bootstrap the app for non-module CLI commands.
     * Uses the centralized CLI bootstrap runtime.
     */
    protected function bootstrapApp(string $channel = 'cli', ?string $path = null): void
    {
        CliAppBootstrap::bootstrap($channel, $path ?? 'bin/console ' . $this->name());
    }

}
