<?php 
 
use Lawondyss\Parex\Parex; 
use Lawondyss\Parex\Parser\ArgvParser; 
use Lawondyss\Parex\Result\DynamicResult; 
use Lawondyss\ParexCommander\Command; 
use Lawondyss\ParexCommander\Console\Writer; 
use Lawondyss\ParexCommander\IO; 
use Lawondyss\ParexCommander\Type; 
 
require_once __DIR__ . '/vendor/autoload.php'; 
 
/** 
 * @param object{env: string, sandbox: bool, user: string} $result 
 */ 
function import(DynamicResult $result, IO $io): never 
{ 
  $io->writeHeader("Import of system's data"); 
  $result->sandbox && $io->writeLn('Testing'); 
  $io->writeLn("'Environment: {$result->env} User: {$result->user} Server: ", $result->sandbox ? 'dev' : 'prod'); 
 
  $sources = $io->makeSelection('Select source(s):', ['server', 'database', 'files'], multiple: true); 
 
  $scope = $io->makeSelection('Select date scope', [ 
    'yesterday' => sprintf( 
      'Yesterday (%s)', 
      date('Y-m-d', strtotime('yesterday')) 
    ), 
    'last:week' => sprintf( 
      'Last week (%s > %s)', 
      date('Y-m-d', strtotime('first day of last week')), 
      date('Y-m-d', strtotime('last day of last week')), 
    ), 
    'last:month' => sprintf( 
      'Last month (%s > %s)', 
      date('Y-m-d', strtotime('first day of last month')), 
      date('Y-m-d', strtotime('last day of last month')), 
    ), 
    'own' => 'I will manually enter', 
  ]); 
 
  if ($scope === 'own') { 
    $scope = $io->makeQuestion( 
      prompt: 'Enter date scope:', 
      validator: static function (string $value): bool|string { 
        if (str_contains($value, '>')) { 
          return count(array_filter( 
            array_map(trim(...), (explode('>', $value) + ['', ''])), 
            static fn (string $date) => (bool)DateTimeImmutable::createFromFormat('Y-m-d', $date), 
          )) === 2 
            ? true 
            : 'Range scope must have format "YYYY-MM-DD > YYYY-MM-DD"'; 
        } else { 
          return DateTimeImmutable::createFromFormat('Y-m-d', $value) 
            ? true 
            : 'Date scope must have format "YYYY-MM-DD"'; 
        } 
      }, 
    ); 
  } 
 
  if (!$result->sandbox && !$io->makeConfirmation('Do you really want to import production data?')) { 
    $io->writeLn('Import aborted.'); 
    $io->exitSuccess(); 
  } 
 
  $label = 'Importing ' . implode(' and ', $sources) . " for {$scope}"; 
  $result = $io->monitoring($label, function (Writer $writer): string { 
    for ($i = 5; $i < 15; $i++) { 
      usleep(1000_000); 
      $writer->writeLn("Processing item #{$i}"); 
    } 
 
    return random_int(0, 3) ? 'Import finished.' : 'Import FAILED!'; 
  }); 
  $io->writeLn($result); 
 
  $io->exitSuccess(); 
} 
 
$command = new Command('import', import(...), 'Importing something...', '1.0'); 
$command->addPositional(Type::email(), 'user', 'Author of import.') 
        ->addOptional(Type::file(false), 'env', 'e', 'Path to .env file.', './.env') 
        ->addFlag('sandbox', help: 'Connecting to dev server instead of production.') 
        ->run(new Parex(new ArgvParser()), new IO()); 
 
 |