<?php

namespace App\Jobs;

use App\Components\Functions;
use App\Models_v2\Attachment;
use App\Models_v2\Conversation;
use App\Models_v2\Message;
use App\Models_v2\MessageRead;
use App\Notifications\NewMessage;
use App\User;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class SendMessageV2 implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    protected $conversationId;
    protected $content;
    protected $userId;
    protected $user;
    public function __construct($conversationId, $content, $userId)
    {
        //
        $this->conversationId = $conversationId;
        $this->content = $content;
        $this->userId = $userId;
        $this->user = User::find($this->userId);
    }

    /**
     * Execute the job.
     *
     * @return void
     */

    public function handle()
    {
        //
        $content = $this->content;
        $conversationId = $this->conversationId;
        $userId = $this->user->id;
        $conversation = Conversation::find($conversationId);
        $uiid = null;
        $type = 'text';

        if (!$conversation) {
            return;
        }
        $ownerId = $this->user->id;

        if ($this->user->type == User::STAFF) {
            $ownerId = $this->user->staff_owner_id;
        }

        $staffOwners = User::query()->where('staff_owner_id', $ownerId)->pluck('id')->toArray();
        $staffOwners[] = $ownerId;

        $userArr = $conversation->users->pluck('id')->toArray();
        if (!in_array($userId, $userArr)) {
            return;
        }

        $message = Message::create([
            'conversation_id' => $conversationId,
            'content' => $content,
            'from' => $userId,
            'type' => $type
        ]);

        $conversation->date_message = Carbon::now()->toDateTimeString();
        $conversation->save();

        $users = $conversation->users;
        foreach ($users as $user) {
            MessageRead::create([
                'message_id' => $message->id,
                'user_id' => $user->id,
                'conversation_id' => $conversationId,
                'read_at' => ($user->id == $this->user->id || Functions::checkUserOnlineConversationV2($user->id, $conversationId)) ? Carbon::now()->toDateTimeString() : null
            ]);
        }

        $sender = optional($message->sender);
        $attachments = $message->attachments;
        $hostels = $message->hostels;

        preg_match_all('#\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#', $content, $match);
        $urls = $match[0];
        if (!empty($urls)) {
            $url = $urls[0];
            $openGraph = \OpenGraph::fetch($url);
            if (!empty($openGraph)) {
                if (isset($openGraph['title'])) {
                    $message->type = 'previewURL';
                }
                $message->preview = $openGraph;
                $message->save();
            }
        }

        $retVal = [
            "id" => $message->id,
            'ui_id' => $uiid,
            'conversation_id' => $conversationId,
            'display_text' => $message->display_text,
            "type" => $message->type,
            "created_at" => $message->created_at->format('d/m/Y H:i'),
            "sender" => [
                "id" => $sender->id,
                "name" => $sender->name_text,
                "phone" => $sender->phone,
                "avatar" => $sender->image
            ],
            "content" => $message->content,
            "attachments" => $attachments->map(function ($item) {
                return [
                    "id" => $item->id,
                    "type" => $item->type,
                    "thumbnail" => $item->thumbnail(),
                    "url" => $item->url(),
                    "duration" => $item->duration(),
                    "width" => $item->width(),
                    "height" => $item->height()
                ];
            }),
            "hostels" => $hostels->map(function ($item) {
                return [
                    "id" => $item->id,
                    "name" => $item->name,
                    "image" => $item->image,
                    "address" => $item->address,
                    "desc" => $item->desc
                ];
            }),
            "location" => [
                "longitude" => $message->lng,
                "latitude" => $message->lat
            ],
            'preview' => [
                'url' => !empty($message->preview) ? isset($message->preview['url']) ? $message->preview['url'] : null : null,
                'title' => !empty($message->preview) ? isset($message->preview['title']) ? $message->preview['title'] : null : null,
                'desc' => !empty($message->preview) ? isset($message->preview['description']) ? $message->preview['description'] : null : null,
                'image' => !empty($message->preview) ? isset($message->preview['image']) ? $message->preview['image'] : null : null
            ]

        ];

        $pusher = \PusherService::getClient();

        $userTriggers = $conversation->users()
            ->where('users.id', '<>', $userId)
            ->get();


        foreach ($userTriggers as $userTrigger) {

            if ($userTrigger) {
                $pusher->trigger('chat-v2-' . $userTrigger->id, 'v2-new-message', $retVal);
                if (Functions::checkUserOnlineV2($userTrigger->id, $conversationId)) {
                    \Notification::send($userTrigger, new NewMessage(
                        $this->user,
                        $message
                    ));
                }
            }
        }
        $pusher->trigger('chat-v2-' . $userId, 'v2-new-message', $retVal);
    }
}
