#!/usr/bin/env php
<?php
    require_once __DIR__ . '/public/index.php';

    use Zampet\Services\DB;

    $commands = [
        'seed' => 'Popular as tabelas com dados iniciais: php zampet-cli seed <versao>',
        'migrate' => 'Criar as tabelas no banco de dados: php zampet-cli migrate <versao>',
        'construct' => 'Criar as tabelas e popular com dados iniciais: php zampet-cli construct <versao>'
    ];

    if (!$argv[1] || !$argv[2]) {
        echo "Uso correto:\n";
        foreach ($commands as $cmd => $desc) {
            echo "  php zampet-cli $desc\n";
        }
        exit(1);
    }

    // monta o nome da função dinamicamente
    $functionName = $argv[1]. ucfirst(string: $argv[2]);

    // verifica se a função existe
    if (!function_exists(function: $functionName)) {
        echo "Função '{$argv[2]}' não encontrada.\n";
        exit(1);
    }

    // Pega todos os argumentos que vêm depois do nome da função
    $args = array_slice(array: $argv, offset: 3); // do índice 3 em diante

    // chama a função
    call_user_func_array(callback: $functionName, args: $args);

    // =============================
    // Funções do Tipo Common
    // =============================

    function commonMigrate(string $version) {
        $dir = realpath(path: __DIR__ . "/database/{$version}/migrations");
        if (!is_dir(filename: $dir)) {
            echo "Versão de migration '{$version}' não encontrada.\n";
            exit(1);
        }

        foreach (scandir(directory: $dir) as $file) {
            if (pathinfo(path: $file, flags: PATHINFO_EXTENSION) === 'sql') {
                echo "Executando migration: {$file}...\n";
                $sql = file_get_contents(filename: $dir . '/' . $file);

                // Remove comentários e quebra por ";"
                $sql = preg_replace(pattern: '/--.*[\r\n]/', replacement: '', subject: $sql);
                $statements = array_filter(array: array_map(callback: 'trim', array: explode(separator: ';', string: $sql)));

                DB::beginTransaction();
                try {
                    foreach ($statements as $statement) {
                        if ($statement !== '') {
                            DB::execute(sql: $statement);
                        }
                    }
                    DB::commit();
                } catch (Exception $e) {
                    DB::rollBack();
                    echo "Erro na migration {$file}: {$e->getMessage()}\n";
                    exit(1);
                }
            }
        }

        echo "Migrations solicitadas foram concluídas com sucesso.\n";
    }

    function commonSeed(string $version) {
        $seedFiles = glob(pattern: __DIR__ . "/database/{$version}/seeds/*.sql");
        if (!$seedFiles) {
            echo "Nenhuma seed encontrada para a versão {$version}.\n";
            return;
        }

        // Ordena os arquivos
        usort(array: $seedFiles, callback: fn($a, $b) => strcmp(string1: basename(path: $a), string2: basename(path: $b)));

        foreach ($seedFiles as $file) {
            echo "Executando seed: " . basename(path: $file) . "...\n";
            $sql = file_get_contents(filename: $file);

            // Remove comentários e quebra por ";"
            $sql = preg_replace(pattern: '/--.*[\r\n]/', replacement: '', subject: $sql);
            $statements = array_filter(array: array_map(callback: 'trim', array: explode(separator: ';', string: $sql)));

            DB::beginTransaction();
            try {
                foreach ($statements as $statement) {
                    if ($statement !== '') {
                        DB::execute(sql: $statement);
                    }
                }
            } catch (Exception $e) {
                DB::rollBack();
                echo "Erro na seed " . basename(path: $file) . ": " . $e->getMessage() . "\n";
                exit(1);
            }
        }

        DB::commit();
        echo "Seeds solicitadas foram concluídas com sucesso.\n";
    }