<?php

class ACMS_POST_Role_Insert extends ACMS_POST
{
    function post()
    {
        $Role = $this->extract('role');
        $Role->setMethod('name', 'required');
        $Role->setMethod('name', 'maxlength', '128');
        $Role->setMethod('role', 'operable', sessionWithEnterpriseAdministration() and BID === RBID);
        $Role->setMethod('description', 'maxlength', '512');

        $Role->validate(new ACMS_Validator());

        if ($this->Post->isValidAll()) {
            $DB = DB::singleton(dsn());

            //-----
            // rid
            $rid = $DB->query(SQL::nextval('role_id', dsn()), 'seq');

            //-----------
            // role
            $SQL = SQL::newInsert('role');
            $SQL->addInsert('role_id', $rid);
            foreach ($Role->listFields() as $key) {
                if ($key !== 'blog_list') {
                    $SQL->addInsert('role_' . $key, $Role->get($key));
                }
            }
            $DB->query($SQL->get(dsn()), 'exec');

            //-----------
            // blog list
            $insert = SQL::newBulkInsert('role_blog');
            foreach ($Role->getArray('blog_list') as $bid) {
                $insert->addInsert([
                    'role_id' => $rid,
                    'blog_id' => $bid,
                ]);
            }
            if ($insert->hasData()) {
                $DB->query($insert->get(dsn()), 'exec');
            }

            AcmsLogger::info('「' . $Role->get('name') . '」ロールを作成しました', [
                'roleID' => $rid,
                'data' => $Role->_aryField,
            ]);

            $this->addMessage('ロールを作成しました');

            // PRG: 作成したロールの編集画面へリダイレクトする（リロードによる二重登録を防ぐ）
            $this->redirect(acmsLink([
                'bid' => BID,
                'admin' => 'role_edit',
                'query' => [
                    'rid' => (int) $rid,
                ],
            ]));
        } else {
            AcmsLogger::info('ロールの作成に失敗しました', [
                'validate' => $Role->_aryV,
            ]);
        }
        return $this->Post;
    }
}
