<?php

use Acms\Services\Category\CategoryRepository;
use Acms\Services\Facades\Application as App;
use Acms\Services\Facades\Category;

class ACMS_POST_Category_Index_Parent extends ACMS_POST
{
    public function post()
    {
        if (!Category::canUpdate(BID)) {
            AcmsLogger::warning('権限がないため、指定されたカテゴリーの親カテゴリー変更に失敗しました');
            die403();
        }
        $toParentId = idval($this->Post->get('parent'));
        if (isset($_POST['checks']) && is_array($_POST['checks']) && count($_POST['checks']) > 0) {
            /** @var CategoryRepository $repository */
            $repository = App::make('category.repository');
            $blogId = BID;
            $processedIds = [];
            foreach ($_POST['checks'] as $rawCategoryId) {
                $categoryId = (int) $rawCategoryId;
                if (!$this->canMoveUnderTargetParent($categoryId, $toParentId)) {
                    continue;
                }

                $repository->changeParent($categoryId, $toParentId, $blogId);

                $processedIds[] = $categoryId;
            }
            $name = $toParentId > 0 ? ACMS_RAM::categoryName($toParentId) : 'なし';
            AcmsLogger::info('指定されたカテゴリーの親カテゴリーを「' . $name . '」に変更', [
                'targetCIDs' => implode(',', $processedIds),
            ]);
        }

        return $this->Post;
    }

    /**
     * 移動先の親に対してスコープ的に移動可能かどうか
     *
     * 親が最上位 (parent=0) ならスコープ制約はない。
     * 親が指定されている場合は、自身のスコープと一致するときのみ移動可能。
     * （local 同士・global 同士でしか移動できない）
     */
    private function canMoveUnderTargetParent(int $categoryId, int $toParentId): bool
    {
        if ($toParentId <= 0) {
            return true;
        }
        return ACMS_RAM::categoryScope($toParentId) === ACMS_RAM::categoryScope($categoryId);
    }
}
