<?php

declare(strict_types=1);

namespace MintyPHP\Console\Runner\Module;

interface ModuleRunnerInterface
{
    /**
     * @return array{command: string, status: string, exit_code: int, vendor_warnings_ignored: int, message: string}
     */
    public function dbMigrate(): array;

    /**
     * @return array{command: string, applied: list<string>, pending: list<string>}
     */
    public function dbMigrateStatus(): array;

    /**
     * @return array{command: string, status: string, exit_code: int, vendor_warnings_ignored: int, message: string}
     */
    public function migrate(): array;

    /**
     * @return array{
     *   command: string,
     *   status: string,
     *   exit_code: int,
     *   vendor_warnings_ignored: int,
     *   created: int,
     *   updated: int,
     *   unchanged: int,
     *   deactivated: int,
     *   total: int,
     *   message: string
     * }
     */
    public function permissionsSync(): array;

    /**
     * @return array{
     *   command: string,
     *   status: string,
     *   exit_code: int,
     *   vendor_warnings_ignored: int,
     *   core_entries: int,
     *   module_entries: int,
     *   message: string
     * }
     */
    public function build(): array;

    /**
     * @return array{
     *   command: string,
     *   status: string,
     *   exit_code: int,
     *   vendor_warnings_ignored: int,
     *   mode: string,
     *   created: int,
     *   updated: int,
     *   removed: int,
     *   unchanged: int,
     *   message: string
     * }
     */
    public function assetsSync(): array;

    /**
     * @return array{
     *   command: string,
     *   status: string,
     *   exit_code: int,
     *   vendor_warnings_ignored: int,
     *   message: string
     * }
     */
    public function deactivate(string $moduleId, bool $confirm, bool $dryRun): array;

    /**
     * @return array{
     *   command: string,
     *   status: string,
     *   exit_code: int,
     *   vendor_warnings_ignored_total: int,
     *   duration_ms: int,
     *   steps: array<string, array{status: string, exit_code: int, vendor_warnings_ignored: int}>,
     *   message: string
     * }
     *
     * The `steps` map is keyed in execution order:
     * `db-migrate`, `migrate`, `permissions-sync`, `build`, `assets-sync`.
     */
    public function runtimeSync(): array;
}
