<?php

use Acms\Services\Facades\Application as App;
use Acms\Services\ConfigSet\Authorization;

/**
 * コンフィグセットのインポート画面（CMS-7831）。
 *
 * 編集画面セット・テーマセット用インポート画面（Editor / Theme）はこのクラスを継承し、
 * $type をオーバーライドするだけの薄いサブクラスとして実装する
 * （{@see ACMS_GET_Admin_Config_Set_Editor} / {@see ACMS_GET_Admin_Config_Set_Theme} と同じ方針）。
 */
class ACMS_GET_Admin_Config_Set_Import extends ACMS_GET_Admin
{
    /**
     * コンフィグセットのタイプ。既存セット一覧（置き換え先候補）を同じタイプに限定するために使う。
     *
     * @var string
     */
    protected $type = null;

    /**
     * インポート画面の認可
     *
     * @return bool
     */
    public function auth()
    {
        $authorization = App::make('config_set.authorization');
        assert($authorization instanceof Authorization);

        return $authorization->canManage((int) SUID, BID);
    }

    /**
     * @return string
     */
    public function get()
    {
        if (!$this->auth()) {
            AcmsLogger::notice('認可されていないページにアクセスしました');
            die403();
        }

        $Tpl = new Template($this->tpl, new ACMS_Corrector());

        if (!$this->Post->isValidAll()) {
            $Tpl->add('msg#error');
        }

        if ($this->Post->get('import') === 'success') {
            $Tpl->add('success');
        }

        foreach ($this->Post->getArray('notice') as $configKey) {
            if (!is_string($configKey) || $configKey === '') {
                continue;
            }
            $Tpl->add('cleared_key:loop', ['config_key' => $configKey]);
        }

        // コンフィグセット編集画面からの導線用。?setid=<id> でそのセットを「置き換え対象」として
        // プリセットした状態でこの画面に遷移できる。setid は他の画面（編集画面等）でも
        // 「対象の config_set_id」を表す標準的なクエリキーであり、独自キーを新設しない。
        $replaceConfigSetId = (int) $this->Get->get('setid', 0);

        $SQL = $this->buildExistingSetQuery();
        $DB = DB::singleton(dsn());
        $statement = $DB->query($SQL->get(dsn()), 'exec');
        while ($configSet = $DB->next($statement)) {
            $configSetId = (int) $configSet['config_set_id'];
            $Tpl->add('existing_set:loop', [
                'id' => $configSetId,
                'name' => $configSet['config_set_name'],
                'selected' => $configSetId === $replaceConfigSetId ? config('attr_selected') : '',
            ]);
        }

        $Tpl->add(null, []);

        return $Tpl->get();
    }

    /**
     * 置き換え先候補として一覧に出す既存セットの検索条件。
     * このインポート画面と同じ config_set_type（$type）に限定する（Editor / Theme版で
     * オーバーライドされる。$type が null の場合は base 用として config_set_type IS NULL に絞る）。
     *
     * @return SQL
     */
    protected function buildExistingSetQuery()
    {
        $SQL = SQL::newSelect('config_set');
        $SQL->addWhereOpr('config_set_blog_id', BID);
        $SQL->addWhereOpr('config_set_type', $this->type);
        $SQL->setOrder('config_set_sort', 'ASC');

        return $SQL;
    }
}
