<?php

declare(strict_types=1);

namespace App\Framework\Deployment\Pipeline;

use App\Framework\Config\Environment;
use App\Framework\DI\Container;
use App\Framework\DI\Initializer;
use App\Framework\Deployment\Pipeline\Stages\AnsibleDeployStage;
use App\Framework\Filesystem\ValueObjects\FilePath;
use App\Framework\Logging\Logger;
use App\Framework\Process\Process;

/**
 * Deployment Pipeline Initializer
 *
 * Registers deployment pipeline components with the DI container.
 */
final readonly class DeploymentPipelineInitializer
{
    #[Initializer]
    public function initialize(Container $container): void
    {
        // Register AnsibleDeployStage
        $container->bind(AnsibleDeployStage::class, function (Container $container) {
            $env = $container->get(Environment::class);

            // Get paths from environment or use defaults
            $projectRoot = $env->get('PROJECT_ROOT', '/home/michael/dev/michaelschiemer');
            $inventoryPath = FilePath::fromString($projectRoot . '/deployment/infrastructure/inventories');
            $playbookPath = FilePath::fromString($projectRoot . '/deployment/infrastructure/playbooks/deploy-rsync-based.yml');

            return new AnsibleDeployStage(
                process: $container->get(Process::class),
                logger: $container->get(Logger::class),
                ansibleInventoryPath: $inventoryPath,
                ansiblePlaybookPath: $playbookPath
            );
        });
    }
}
