<?php

declare(strict_types=1);

namespace App\Notifications\Push;

use App\Dtos\InformaciaDto;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
use NotificationChannels\Fcm\Exceptions\CouldNotSendNotification;
use NotificationChannels\Fcm\FcmMessage;
use NotificationChannels\Fcm\Resources\AndroidConfig;
use NotificationChannels\Fcm\Resources\AndroidNotification;
use NotificationChannels\Fcm\Resources\ApnsConfig;
use NotificationChannels\Fcm\Resources\Notification as FCMNotification;
use Seka\Portal\Core\Notifications\FirebaseCloudMessaging\Channels\FcmChannel;
use Seka\Portal\Core\Notifications\FirebaseCloudMessaging\Messages\Data\Enums\MessageDataMethodEnum;
use Seka\Portal\Core\Notifications\FirebaseCloudMessaging\Messages\Data\Enums\MessageDataSourceEnum;
use Seka\Portal\Core\Notifications\FirebaseCloudMessaging\Messages\Data\Enums\MessageDataTypeEnum;
use Seka\Portal\Core\Notifications\FirebaseCloudMessaging\Messages\MessageDataBuilder;

/**
 * Class MAAISEKInformaciaPouzivatelPushNotification
 *
 * @package App\Notifications\Push
 */
final class MAAISEKInformaciaPouzivatelPushNotification extends Notification implements ShouldQueue
{
    use Queueable;

    /**
     * @var \App\Dtos\InformaciaDto
     */
    private InformaciaDto $informaciaDto;

    /**
     * @param \App\Dtos\InformaciaDto $informaciaDto
     */
    public function __construct(InformaciaDto $informaciaDto)
    {
        $this->informaciaDto = $informaciaDto;
    }

    /**
     * @return string[]
     */
    public function via($notifiable): array
    {
        return [
            FcmChannel::class,
        ];
    }

    /**
     * @return string[]
     */
    public function viaQueues(): array
    {
        return [
            FcmChannel::class => 'push-notifications-queue',
        ];
    }

    /**
     * @throws CouldNotSendNotification
     */
    public function toFcm($notifiable): FcmMessage
    {
        $unreadNotificationsCount = $notifiable->unreadNotifications()->count();
        $data = MessageDataBuilder::make(
            MessageDataSourceEnum::PORTAL_WEB(),
            MessageDataTypeEnum::INTERACTIVE(),
            MessageDataMethodEnum::MAA_SHOW_PORTAL_INFORMATION_SCREEN(),
            ['informaciaId' => $this->informaciaDto->id],
        );

        return FcmMessage::create()
            ->setData($data->toArray())
            ->setNotification(
                FCMNotification::create()
                    ->setTitle($this->informaciaDto->titulok)
                    ->setBody($this->informaciaDto->uvod),
            )
            ->setAndroid(
                AndroidConfig::create()->setNotification(
                    AndroidNotification::create()->setNotificationCount($unreadNotificationsCount),
                ),
            )
            ->setApns(ApnsConfig::create()->setPayload(['aps' => ['badge' => $unreadNotificationsCount]]));
    }
}
