#!/usr/bin/env php
<?php

/**
 * Publishes enabled module web assets into web/modules/.
 *
 * Usage: php bin/module-assets-sync.php
 *
 * APP_MODULE_ASSET_MODE:
 * - symlink (default): create web/modules/<module-id> symlinks to modules/<id>/web
 * - copy:              copy module web directories (for environments without symlink support)
 *
 * Exit codes:
 *   0 — sync successful
 *   1 — error during sync
 */

declare(strict_types=1);

use MintyPHP\App\Module\ModuleRegistry;
use MintyPHP\App\Module\ModuleRuntimeAssetPublisher;

require_once __DIR__ . '/module-cli-bootstrap.php';

function moduleAssetsSyncRun(): int
{
    return moduleCliRunStep('module-assets-sync', static function (): int {
        $runtimeModulesDir = __DIR__ . '/../web/modules';
        $lockFile = __DIR__ . '/../storage/runtime/.module-assets-sync.lock';
        $mode = (string) getenv('APP_MODULE_ASSET_MODE');
        if (trim($mode) === '') {
            $mode = 'symlink';
        }

        return moduleCliWithFileLock(
            $lockFile,
            'module-assets-sync: another sync is in progress, skipping.',
            static function () use ($runtimeModulesDir, $mode): int {
                $registry = app(ModuleRegistry::class);
                $publisher = new ModuleRuntimeAssetPublisher();
                $result = $publisher->publish($runtimeModulesDir, $registry->getModules(), $mode);

                fwrite(STDOUT, sprintf(
                    "module-assets-sync: mode=%s created=%d updated=%d removed=%d unchanged=%d\n",
                    $mode,
                    $result['created'],
                    $result['updated'],
                    $result['removed'],
                    $result['unchanged']
                ));

                return 0;
            }
        );
    });
}

if (PHP_SAPI === 'cli' && realpath((string) ($_SERVER['SCRIPT_FILENAME'] ?? '')) === __FILE__) {
    exit(moduleAssetsSyncRun());
}
