<?php

use Acms\Services\Facades\Config;
use Acms\Services\Facades\Common;
use Acms\Services\Facades\Logger;
use Acms\Services\Facades\Application as App;
use Acms\Services\ConfigSet\Import;
use Acms\Services\ConfigSet\Authorization;

/**
 * コンフィグセット単体のインポート（CMS-7831）。
 *
 * フォームのインポート（ACMS_POST_Form_Import）と同じ作法。
 * `setid`（対象の config_set_id を表す標準的なクエリキー）が指定されていれば既存セットを
 * 置き換え、未指定なら新規作成する。
 * カテゴリー/メディア参照キーはクリアされる（安全側のデフォルト。Acms\Services\ConfigSet\Import 参照）。
 * ルール別上書き設定は Acms\Services\ConfigSet\Export がエクスポート対象外にしているため、
 * このハンドラが受け取る YAML にはそもそも含まれない。
 */
class ACMS_POST_Config_Set_Import extends ACMS_POST
{
    /**
     * @inheritDoc
     */
    public function post()
    {
        @set_time_limit(0);

        if (!$this->checkAuth()) {
            return $this->Post;
        }

        try {
            $path = $_FILES['file']['tmp_name'];
            if (is_uploaded_file($path) === false) {
                throw new \RuntimeException('無効なファイルです。');
            }
            $yaml = Config::yamlLoad($path);

            $replaceConfigSetId = (int) $this->Post->get('setid', 0);

            $import = App::make('config_set.import');
            assert($import instanceof Import);
            $newSetId = $import->run(BID, $yaml, $replaceConfigSetId > 0 ? $replaceConfigSetId : null);

            $this->Post->set('notice', $import->getClearedKeys());
            $this->Post->set('import', 'success');
            $this->Post->set('config_set_id', $newSetId);

            Logger::info('コンフィグセットをインポートしました', [
                'config_set_id' => $newSetId,
                'cleared_keys' => $import->getClearedKeys(),
            ]);
        } catch (\Throwable $e) {
            $this->addError($e->getMessage());

            Logger::notice('コンフィグセットのインポートに失敗しました。' . $e->getMessage(), Common::exceptionArray($e));
        }

        return $this->Post;
    }

    /**
     * check auth
     *
     * @return bool
     */
    private function checkAuth()
    {
        $authorization = App::make('config_set.authorization');
        assert($authorization instanceof Authorization);
        if (!$authorization->canManage((int) SUID, BID)) {
            return false;
        }
        if (!isset($_FILES['file']['tmp_name']) || $_FILES['file']['tmp_name'] === '') {
            $this->addError('No file was uploaded.');
            return false;
        }
        if (is_uploaded_file($_FILES['file']['tmp_name']) === false) {
            $this->addError('Invalid file.');
            return false;
        }
        return true;
    }
}
