#!/usr/bin/env bash
# database/create -- create a database with a least-privilege user
set -o pipefail
SELF=$(readlink -f "${BASH_SOURCE[0]}")
NV_BASE=$(cd "$(dirname "$SELF")/../../.." && pwd)
export NV_BASE
# shellcheck source=/dev/null
. "$NV_BASE/lib/core/bootstrap.sh"

nv_require_root || exit 1
ui_header "$(t mod_db_create)"

db_available || { ui_err "$(t db_unreachable)"; exit 1; }

printf '  %s: ' "$(t db_prompt_name)"
read -r name || exit 130
name=$(nv_trim "$name")
nv_valid_dbname "$name" || { ui_err "$(t db_bad_name)"; exit 2; }

printf '  %s [%s]: ' "$(t db_prompt_user)" "$name"
read -r dbu || exit 130
dbu=$(nv_trim "$dbu"); [ -z "$dbu" ] && dbu=$name
nv_valid_dbuser "$dbu" || { ui_err "$(t db_bad_user)"; exit 2; }

if db_root_exec "SHOW DATABASES LIKE '$name'" 2>/dev/null | grep -q .; then
    ui_err "$(t db_exists "$name")"
    exit 2
fi

pass=$(openssl rand -base64 24 2>/dev/null | tr -d '/+=' | cut -c1-24)
[ -n "$pass" ] || { nv_fail 3110 "$(t db_pass_gen_failed)"; exit 1; }

db_root_exec "CREATE DATABASE \`$name\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" || {
    nv_fail 3102 "$(t site_fail_db)"; exit 1; }
db_root_exec "CREATE USER '$dbu'@'localhost' IDENTIFIED BY '$pass'" || {
    nv_fail 3103 "$(t site_fail_db_user)"; exit 1; }
db_root_exec "GRANT ALL PRIVILEGES ON \`$name\`.* TO '$dbu'@'localhost'" || {
    nv_fail 3104 "$(t site_fail_grant)"; exit 1; }
db_root_exec "FLUSH PRIVILEGES" >/dev/null 2>&1 || true
nv_trace db-create "$name $dbu"

ui_blank
ui_ok "$(t db_created "$name")"
ui_kv "$(t db_host)" localhost
ui_kv "$(t db_name)" "$name"
ui_kv "$(t db_user)" "$dbu"
ui_kv "$(t db_pass)" "$pass"
ui_blank
ui_warn "$(t db_pass_once)"
exit 0
