<?php
declare(strict_types=1);

/**
 * Cria um administrador ou troca a senha dele. Rode no servidor, como o usuário do Apache:
 *   sudo -u www-data php /var/www/sellout-latam/bin/criar-admin.php boris
 * A senha é pedida sem aparecer na tela.
 */

if (PHP_SAPI !== 'cli') {
    http_response_code(404);
    exit;
}
require dirname(__DIR__) . '/app/inicio.php';

$args = array_slice($argv, 1);
$usuario = '';
foreach ($args as $a) {
    if ($a !== '' && $a[0] !== '-') {
        $usuario = mb_strtolower(trim($a));
    }
}
if ($usuario === '' || in_array('-h', $args, true) || in_array('--help', $args, true)) {
    fwrite(STDERR, "Uso: sudo -u www-data php " . __FILE__ . " <usuario>\n"
        . "Cria o administrador <usuario> (ou troca a senha dele, se já existir).\n");
    exit(1);
}
if (!preg_match('/^[a-z0-9._@-]{2,60}$/', $usuario)) {
    fwrite(STDERR, "Usuário inválido: use letras, números, ponto, hífen ou _ (2 a 60 caracteres).\n");
    exit(1);
}
if (function_exists('posix_geteuid') && posix_geteuid() === 0 && !in_array('--root', $args, true)) {
    fwrite(STDERR, "Não rode como root: o banco de dados ficaria com o dono errado e o site não conseguiria gravar.\n"
        . "Use:  sudo -u www-data php " . __FILE__ . " $usuario\n");
    exit(1);
}

function pergunta(string $texto): string
{
    fwrite(STDOUT, $texto);
    $terminal = function_exists('posix_isatty') ? posix_isatty(STDIN) : stream_isatty(STDIN);
    if ($terminal) {
        shell_exec('stty -echo 2>/dev/null');
    }
    $linha = fgets(STDIN);
    if ($terminal) {
        shell_exec('stty echo 2>/dev/null');
        fwrite(STDOUT, "\n");
    }
    return rtrim((string) $linha, "\r\n");
}

$existia = Banco::admin($usuario) !== null;
fwrite(STDOUT, ($existia ? "Trocando a senha de \"$usuario\"." : "Criando o administrador \"$usuario\".") . "\n");
$senha = pergunta('Senha (mínimo 10 caracteres, com letras e números): ');
$problema = Seguranca::problemaDaSenha($senha);
if ($problema !== null) {
    fwrite(STDERR, $problema . "\n");
    exit(1);
}
if (pergunta('Repita a senha: ') !== $senha) {
    fwrite(STDERR, "As senhas não são iguais. Nada foi mudado.\n");
    exit(1);
}
Banco::salvaAdmin($usuario, $senha);
fwrite(STDOUT, ($existia ? 'Senha trocada.' : 'Administrador criado.') . " Entre em https://<seu-domínio>/admin.php\n");
