<?php

namespace Acms\Traits\Entry;

use Acms\Services\Facades\Entry;

/**
 * エントリーの表示順を変更する操作の権限判定
 *
 * 表示順は「絶対値の指定」と「ドラッグ&ドロップによる並べ替え」の 2 つの入口を持ち、
 * どちらも同じ権限で守られる必要があるため、判定をこのトレイトに集約する。
 */
trait SortPermissionTrait
{
    /**
     * 表示順のカラム名から、権限判定に使う種別を求める
     *
     * @param string|null $sortField
     * @return 'entry' | 'category' | 'user'
     */
    protected function resolveSortType(?string $sortField): string
    {
        if ($sortField === 'entry_category_sort') {
            return 'category';
        }
        if ($sortField === 'entry_user_sort') {
            return 'user';
        }
        return 'entry';
    }

    /**
     * 表示順の変更が可能かどうかを判定する
     *
     * @param 'entry' | 'category' | 'user' $type
     * @return bool
     */
    protected function canOperateSort(string $type): bool
    {
        if (!Entry::canChangeOrder($type, BID)) {
            return false;
        }
        /** @var int|null $sessionUserId */
        $sessionUserId = SUID;
        /** @var int|null $userId */
        $userId = UID;
        if ($type === 'user' && $userId !== $sessionUserId) {
            return Entry::canChangeOrderByOtherUser(BID);
        }
        return true;
    }
}
