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

/**
 * Crea una semilla siguiendo la convención del proyecto.
 *
 * Uso: php bin/make-seeder <orden> <nombre_en_snake_case> [tabla] [--dry-run]
 *
 *   php bin/make-seeder 026 dias_no_laborables festivos_extra
 *
 * El primer argumento es el prefijo de orden y decide el perfil al que pertenece
 * la semilla: 0xx base, 1xx módulos, 2xx escenarios de demostración.
 */

$basePath = dirname(__DIR__);
$directorio = $basePath . '/database/seeders';

$argumentos = array_values(array_filter(array_slice($argv, 1), function ($a) {
    return $a !== '--dry-run';
}));
$dryRun = in_array('--dry-run', $argv, true);

$orden = isset($argumentos[0]) ? $argumentos[0] : '';
$slug = isset($argumentos[1]) ? strtolower($argumentos[1]) : '';
$tabla = isset($argumentos[2]) ? $argumentos[2] : $slug;

if (!preg_match('/^[0-2]\d{2}$/', $orden) || !preg_match('/^[a-z0-9]+(?:_[a-z0-9]+)*$/', $slug)) {
    fwrite(STDERR,
        "Uso: php bin/make-seeder <orden> <nombre_en_snake_case> [tabla] [--dry-run]\n\n"
        . "  orden   tres dígitos: 0xx base, 1xx módulos, 2xx escenarios demo\n"
        . "  nombre  en snake_case, sin el sufijo Seeder\n"
        . "  tabla   tabla destino (por omisión, el nombre)\n\n"
        . "Ejemplo: php bin/make-seeder 026 dias_no_laborables festivos_extra\n");
    exit(1);
}

// Avisa si el prefijo ya está tomado: dos semillas con el mismo orden dejarían
// la ejecución sin un orden definido.
$ocupados = glob($directorio . '/' . $orden . '_*.php');
if (!empty($ocupados)) {
    fwrite(STDERR, "El orden {$orden} ya lo usa " . basename($ocupados[0]) . ".\n");
    exit(1);
}

$clase = str_replace(' ', '', ucwords(str_replace('_', ' ', $slug))) . 'Seeder';
$destino = $directorio . '/' . $orden . '_' . $clase . '.php';

$plantilla = <<<PHP_TEMPLATE
<?php

/**
 * TODO: describir qué siembra esta semilla y de qué depende.
 *
 * Rango de Id: TODO. Ver el reparto en database/README.md.
 */
class {$clase} extends Seeder
{
    const TABLA = '{$tabla}';

    public function run()
    {
        // La clave de negocio se toma de ClavesDeNegocio; pásala como tercer
        // argumento solo si esta semilla necesita otra distinta.
        \$this->upsert(self::TABLA, \$this->datos());
    }

    /** Datos sembrados en `{$tabla}`. */
    private function datos()
    {
        return array(
            // array('Id' => 1, ...),
        );
    }
}

PHP_TEMPLATE;

if ($dryRun) {
    echo "Se crearía: {$destino}\n\n{$plantilla}";
    exit(0);
}

if (file_exists($destino)) {
    fwrite(STDERR, "Ya existe: {$destino}\n");
    exit(1);
}

if (file_put_contents($destino, $plantilla) === false) {
    fwrite(STDERR, "No se pudo crear: {$destino}\n");
    exit(1);
}

echo "Creada: {$destino}\n";
