<?php

namespace Acms\Services\Installer;

use Acms\Services\Facades\Fulltext;
use Acms\Services\Facades\Database as DB;
use SQL;

/**
 * 初回インストール時の管理者 user レコードを作成する
 *
 * 旧 setup/lib/import.php の Import::generateUser() を Services 層に抽出したもの。
 * パスワードは acmsUserPasswordHash() でハッシュ化する。
 * 作成後、user の fulltext も生成する。
 */
final class AdminUserFactory
{
    /**
     * admin user レコードを 1 件作成し、user_id を返す
     *
     * @param int $blogId 所属ブログ ID
     * @param string $code user_code (ログイン ID)
     * @param string $name user_name (表示名)
     * @param string $password 平文パスワード (内部でハッシュ化)
     * @param string $mail user_mail
     * @return int 新しい user_id
     */
    public function create(
        int $blogId,
        string $code,
        string $name,
        string $password,
        string $mail,
    ): int {
        $userId = (int) DB::query(SQL::nextval('user_id', dsn()), 'seq');

        $sql = SQL::newInsert('user');
        $sql->addInsert('user_id', $userId);
        $sql->addInsert('user_code', $code);
        $sql->addInsert('user_status', 'open');
        $sql->addInsert('user_sort', '1');
        $sql->addInsert('user_name', $name);
        $sql->addInsert('user_pass', acmsUserPasswordHash($password));
        if (defined('PASSWORD_ALGORITHM_GENERATION')) {
            $sql->addInsert('user_pass_generation', (string) constant('PASSWORD_ALGORITHM_GENERATION'));
        }
        $sql->addInsert('user_pass_reset', '');
        $sql->addInsert('user_mail', $mail);
        $sql->addInsert('user_mail_magazine', 'on');
        $sql->addInsert('user_mail_mobile', '');
        $sql->addInsert('user_mail_mobile_magazine', 'on');
        $sql->addInsert('user_url', '');
        $sql->addInsert('user_auth', 'administrator');
        $sql->addInsert('user_indexing', 'on');
        $sql->addInsert('user_mode', 'debug');
        $sql->addInsert('user_generated_datetime', date('Y-m-d H:i:s'));
        $sql->addInsert('user_login_anywhere', 'on');
        $sql->addInsert('user_login_expire', '9999-12-31');
        $sql->addInsert('user_blog_id', (string) $blogId);
        DB::query($sql->get(dsn()), 'exec');

        // user の全文検索インデックスも生成 (検索や login 周りで必要)
        Fulltext::saveFulltext('uid', $userId, Fulltext::loadUserFulltext($userId), $blogId);

        return $userId;
    }
}
