<?php

declare(strict_types=1);

/**
 * @copyright  2020 Podlibre
 * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
 * @link       https://castopod.org/
 */

use App\Models\ActorModel;
use CodeIgniter\Database\Exceptions\DataException;
use Modules\Auth\Entities\User;
use Modules\Fediverse\Entities\Actor;

if (! function_exists('user')) {
    /**
     * Returns the User instance for the current logged in user.
     */
    function user(): ?User
    {
        $authenticate = service('authentication');
        $authenticate->check();
        return $authenticate->user();
    }
}

if (! function_exists('set_interact_as_actor')) {
    /**
     * Sets the actor id of which the user is acting as
     */
    function set_interact_as_actor(int $actorId): void
    {
        $authenticate = service('authentication');
        $authenticate->check();

        $session = session();
        $session->set('interact_as_actor_id', $actorId);
    }
}

if (! function_exists('remove_interact_as_actor')) {
    /**
     * Removes the actor id of which the user is acting as
     */
    function remove_interact_as_actor(): void
    {
        $session = session();
        $session->remove('interact_as_actor_id');
    }
}

if (! function_exists('interact_as_actor_id')) {
    /**
     * Sets the podcast id of which the user is acting as
     */
    function interact_as_actor_id(): int
    {
        $authenticate = service('authentication');
        $authenticate->check();

        $session = session();
        return $session->get('interact_as_actor_id');
    }
}

if (! function_exists('interact_as_actor')) {
    /**
     * Get the actor the user is currently interacting as
     */
    function interact_as_actor(): Actor | false
    {
        $authenticate = service('authentication');
        $authenticate->check();

        $session = session();
        if ($session->has('interact_as_actor_id')) {
            return model(ActorModel::class)->getActorById($session->get('interact_as_actor_id'));
        }

        return false;
    }
}

if (! function_exists('can_user_interact')) {
    /**
     * @throws DataException
     */
    function can_user_interact(): bool
    {
        return (bool) interact_as_actor();
    }
}