<?php

/*
 * Copyright (c) 2010-2022 Tim Düsterhus.
 *
 * Use of this software is governed by the Business Source License
 * included in the LICENSE file.
 *
 * Change Date: 2026-09-17
 *
 * On the date above, in accordance with the Business Source
 * License, use of this software will be governed by version 2
 * or later of the General Public License.
 */

namespace chat\system\command;

use chat\data\command\Command;
use chat\data\room\Room;
use wcf\data\DatabaseObjectDecorator;
use wcf\data\IDatabaseObjectProcessor;
use wcf\data\object\type\ObjectTypeCache;
use wcf\data\user\UserProfile;
use wcf\system\exception\UserInputException;

/**
 * Default implemention for command processors.
 */
abstract class AbstractCommand extends DatabaseObjectDecorator implements
    ICommand,
    IDatabaseObjectProcessor
{
    /**
     * @inheritDoc
     */
    protected static $baseClass = Command::class;

    /**
     * @inheritDoc
     */
    public function isAvailable(Room $room, ?UserProfile $user = null)
    {
        return true;
    }

    /**
     * @inheritDoc
     */
    public function allowWithoutTrigger()
    {
        return false;
    }

    /**
     * Returns the object type ID for the given message type.
     *
     * @param  string
     * @return int
     */
    public function getMessageObjectTypeID($objectType)
    {
        $objectTypeID = ObjectTypeCache::getInstance()->getObjectTypeIDByName(
            'be.bastelstu.chat.messageType',
            $objectType
        );

        if (!$objectType) {
            throw new \LogicException('Missing object type');
        }

        return $objectTypeID;
    }

    /**
     * Ensures that the given parameter exists in the parameter array and
     * throws otherwise.
     *
     * @param  array  $parameters
     * @param  string $key
     * @return mixed  The value.
     */
    public function assertParameter($parameters, $key)
    {
        if (\array_key_exists($key, $parameters)) {
            return $parameters[$key];
        }

        throw new UserInputException('message');
    }
}